【问题标题】:return an object from socket using asynctask使用 asynctask 从套接字返回一个对象
【发布时间】:2014-01-22 01:00:26
【问题描述】:

我正在尝试保存通过套接字连接获得的集合。我使用AsyncTask 从具有集合的套接字读取消息。我的问题是我无法保存此消息。在OnpostExecute() 中没有显示 Log.d() 消息。如果我这样做ReceiveMsgAsyncTask().execute().get(),用户界面就会冻结。我已经阅读了许多类似的问题,但我找不到解决方案。如何保存从我的套接字收到的消息?提前谢谢..

private class ReceiveMsgAsyncTask extends AsyncTask<Object, Void, Object> {
    final Collection <String> col = new ArrayList<String>();
    Socket socket = null ;
    ObjectInputStream in = null;
    @Override
    protected Object doInBackground(Object... arg0) {
        // TODO Auto-generated method stub;
        Object msg = null;
         try {
                socket = new Socket(host,50000);
                in = new ObjectInputStream(socket.getInputStream());
                msg = in.readObject();
            } catch (UnknownHostException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally {
                try {
                    in.close();
                    socket.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        return msg;
    }

    protected void onPostExecute(Object result) {
        // TODO Auto-generated method stub
        Log.d("mesg","success");
        super.onPostExecute(result);
        col.addAll((Collection<?extends String>)result);
    }

这是服务器向客户端发送集合的方法

public void splitData(Master master,String client){
        int chunk=0;
        int chunckStart=0;
            BufferedReader br = null;
            ObjectOutputStream out = null;
            try {
                String sCurrentLine;
                br = new BufferedReader(new FileReader("input"));
                int numberOflines=0;
                while ((sCurrentLine = br.readLine()) != null) {
                    numberOflines++;
                }
                br.close();
                br = new BufferedReader(new FileReader("input"));
                for (int i=1;i<=master.numberOfWorkers;i++){
                    out = new ObjectOutputStream(incoming.getOutputStream());
                    Worker Mworker = new Worker(clientsList.get(i-1));
                    if (i==master.numberOfWorkers){
                        if (numberOflines%master.numberOfWorkers!=0)
                            chunk = ((numberOflines/master.numberOfWorkers)*i)+numberOflines%master.numberOfWorkers;
                        else chunk = ((numberOflines/master.numberOfWorkers)*i);
                    }
                    else chunk = ((numberOflines/master.numberOfWorkers)*i);
                    int counter = chunk;
                    while (counter>chunckStart) {
                        sCurrentLine = br.readLine();
                        System.out.println(sCurrentLine);
                        //Mworker.reduce(sCurrentLine, 1);
                        Mworker.getCollection().add(sCurrentLine);
                        counter--;
                    }
                    System.out.println("----------------------------------");
                    chunckStart = chunckStart +(numberOflines/master.numberOfWorkers);
                    System.out.println(Mworker.getWorkerName()+" has the list:");
                    //System.out.println(Mworker.getHashReduce());
                    System.out.println(Mworker.getCollection());
                    out.writeObject(Mworker.getCollection());//send chunk to the worker/client
                    //out.flush();
                    //out.close();
                }

            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (br != null) br.close();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
            //Mworker.hashReduce
        //}
    }

【问题讨论】:

  • 那么是否有服务器在 host:50000 上发送内容?如果您尝试 telnet 到此,您可以连接吗?
  • 连接无效...问题是我无法保存从连接中读取的对象。(msg = in.readObject())
  • 如果服务器通过原始 tcp 套接字向您发送该对象,您的代码应该可以工作。另一方面,您应该在一段时间后在 logcat 中看到某种异常。如果您这样做,请将其添加到您的问题中。
  • 请发布您的服务器代码。
  • 虽然它不起作用...col 是空的...不,当我使用 AsyncTask.execute() 时,我没有例外。当我使用 AsyncTask.execute().get(1, TimeUnit.MILLISECONDS); 时,我有一个 java.util.concurrent.TimeoutException

标签: java android sockets android-asynctask


【解决方案1】:

请查看AsyncTask.get()的文档,其中明确说明

Waits if necessary for the computation to complete, and then retrieves its result.

因此,调用 'get' 否定了使用 asynctask 的全部理由。

你需要做的是:

  1. 使用回调方法创建接口。
  2. 让您的活动或片段实现该接口。
  3. 让您的 ReceiveMsgAsyncTask 采用在其构造函数上实现该接口的对象。
  4. 在 ReceiveMsgAsyncTask 的 onPostExecute 中调用回调方法,将结果传递给它。

现在常见的陷阱是,如果 Activity 关闭或以其他方式失效,会发生什么情况。这可能会导致崩溃和其他各种奇怪现象。

解决该问题的最简单方法是保留任何未完成的异步任务的副本,然后在您的活动或片段的 onPause 方法中取消。

【讨论】:

  • 1.我使用方法创建了一个接口,比如说 callback() 2.我让我的活动来实现该接口 3.我不明白...AsyncTasks 没有构造函数方法。对不起,但是我是新手。你能给我一个例子吗?谢谢public interface ReceiveInterface { void callback(); }
  • 试试public interface ReceiveInterface { void callback( Object result ); }
  • 我的问题毕竟出在服务器上。谢谢大家的回答
【解决方案2】:

我猜你的 Worker 类没有实现 Serializable

Javadoc

只有支持 java.io.Serializable 接口的对象才能写入流。

【讨论】:

  • 好吧,确实我的工人类没有实现 Serializable。我修复了它,但问题仍然存在...... col 是空的。在服务器端 col 不是空的。
  • 那么Mworker.getCollection() 呢?你的收藏可以序列化吗?
  • 你的意思是这样的吗?私人收藏 extends Serializable> dataCollection = new ArrayList();
猜你喜欢
  • 1970-01-01
  • 2020-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
相关资源
最近更新 更多