0

Situation : A function calls a thread to send data to the server. This thread in turn spawns yet another thread, to obtain results from the server using ObjectInputStream().

Finally, this object is returned to the calling function by the spawned thread.

Note: The threads are Callable and are synchronized.

Problem : I get an exception, "FutureTask cannot be cast to MyClassName".

I didn't find a solution to this on the web. Any suggestions ?

Client Code:

public synchronized Object invoke(Object proxy, Method m, Object[] args) throws Throwable
              {

                    try {

// Lots of if-else statements
//.........

                    else if (m.toString().contains("getPosition"))
                    {                       
                        if (!offload){
                        Log.d("DProxy","Sprite Redirection takes place here 6 "+m.invoke(v, args).toString());

                        //System.out.println("PROXY Tick Argument is ");

                        return m.invoke(v, args);
                        }
                        else
                        {
                                //Code to create THREAD on the Endpoint

                        if (endpoint !=null)
                        {

                            if (!serialized)
                            {       
                                    System.out.println("serializing via proxy itself 11");
                                    this.endpoint.serialize(obj);
                                    serialized  = true;
                            }

                            Object[] args1 = new Object[args.length+1];

                            for (i=0;i<args.length;i++)
                                args1[i]=args[i];

                            args1[i]= m.toString();

 // ** Error is thrown at this line below**
     Vec2 tmp = (Vec2) this.endpoint.onClick(args1);

                                return tmp;
                                //return null; 
                            }
                            else
                                System.out.println("Endpoint is NULL");
                        }
                    }

onclick() method.

public synchronized Object onClick(Object[] args) {
    try {
            latch.await();
            ctr++;
                Log.d("CLIENT","Sending Param to Client "+args[args.length-1].toString()+"  "+ctr);

        objectOutputStream.writeBoolean(false);

        // TEMP Commented
        objectOutputStream.flush();
        objectOutputStream.reset();
        objectOutputStream.writeObject(args);

        Callable<Object> worker = (Callable<Object>) new ClientThread(thisSocket,ctr);
        return executor.submit(worker);

}catch (Exception e)
{
    Log.e("ENDPOINT Exception",e.toString());
}
        Log.e("ENDPOINT","Returning blank Object");
        return new Object();
    }            

class ClientThread implements Callable <Object>{//Runnable {

    private int ctr;

    public ClientThread(Socket socket, int ctr)
    {
        this.ctr = ctr;
    }

    public synchronized Object call() {
        Vec2 res1 = null;
        Double res2=null;
        Object res = null;

        try {

            Log.v("CLIENT","Attempting to receive results from Server "+ctr);
            res = objectInputStream.readObject();

            if (res instanceof Vec2)
                {
                    res1 = (Vec2) res;
                    Log.v("CLIENT", "Object received Vec2 "+ctr);
                }
            else if (res instanceof Double)
                {
                    res2 = (Double) res;
                    Log.v("CLIENT", "Object received Double "+ctr);
                }
            else
                if(res==null)
                    Log.v("CLIENT", "Object received is NULL "+ctr);
                else
                    Log.v("CLIENT", "Object received of UNKNOWN Type  "+ctr);


    } catch (UnknownHostException e1) {
            Log.e("CLIENT receive error 1",e1.toString());
        } catch (IOException e1) {
            Log.e("CLIENT receive error 2",e1.toString());

        }
        catch (Exception e)
        {
            Log.e("CLIENT receive error 3",e.toString());
        }
        if (res1 !=null)
        return res1;
        else
            if (res2!=null)
                return res2;
            else
                return res;
    }
  //}

}
Abhishek
  • 743
  • 1
  • 15
  • 28

2 Answers2

1

Any object can not be casted to any class or interface except classes/interfaces it extends/implements. FutureTask implements interfaces RunnableFuture, Runnable and Future.

Ilia Kopylov
  • 758
  • 7
  • 18
0

OK its gone now. I just implemented ClientThread's code as merely a function call !

Strange are the ways of Java.....

Abhishek
  • 743
  • 1
  • 15
  • 28