【问题标题】:Android: FutureTask cannot be cast to MyClassAndroid:FutureTask 无法转换为 MyClass
【发布时间】:2014-02-16 18:48:42
【问题描述】:

情况:函数调用线程向服务器发送数据。这个线程又会产生另一个线程,以使用 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;
    }
  //}

}

【问题讨论】:

  • MyClassName 是否扩展 FutureTask?
  • 如果您将发布您的代码示例,将更容易回答您的问题
  • 不要,不,它没有。迈克尔,我现在在原始帖子中添加了源代码。这里的 MyClassName 实际上是 Vec2。

标签: android multithreading objectinputstream callable futuretask


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    好的,它现在消失了。我只是将ClientThread的代码实现为一个函数调用!

    Java 的方式很奇怪.....

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多