Android:FutureTask无法强制转换为MyClass

时间:2014-02-16 18:48:43

标签: android multithreading objectinputstream callable futuretask

情境:函数调用线程将数据发送到服务器。该线程反过来产生另一个线程,使用ObjectInputStream()从服务器获取结果。

最后,该对象由生成的线程返回给调用函数。

注意:线程 Callable 并且同步

问题:我收到异常,“ FutureTask无法转换为MyClassName ”。

我没有在网上找到解决方案。有什么建议吗?

客户代码

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()方法。

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;
    }
  //}

}

2 个答案:

答案 0 :(得分:1)

除了扩展/实现的类/接口之外,任何对象都不能被转换为任何类或接口。 FutureTask实现接口RunnableFutureRunnableFuture

答案 1 :(得分:0)

好吧现在好了。我刚刚将ClientThread的代码实现为函数调用!

奇怪的是Java的方式......