同时从套接字读写

时间:2014-06-21 16:36:40

标签: java android multithreading sockets

我在java中编写了一个Android应用程序,我想创建一个在while(true)循环中接收消息的侦听器,并且还能够向服务器发送消息。 对于此任务,我使用asyncTask的套接字。 我写了一个connectionHandler类来处理我的应用程序的所有发送和接收请求。

到目前为止一切顺利,一切都在流利地工作,一次只发送和接收一条消息,但我无法找到一种方法同时进行。

我需要在一个帖子中执行以下代码,但我不知道该怎么做,因为我必须返回String

public static String receive() {
    try {
        return mConnectionHandler.new AsyncReceiveFromServer().execute()
                .get();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }
    return null;
}

private class AsyncReceiveFromServer extends AsyncTask<Void, Void, String> {

    @Override
    protected String doInBackground(Void... params) {
        String result = null;
        try {
            result = in.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }
}

当我在while(true)循环中运行接收函数时,我无法发送消息,因为...execute().get()阻止了java类connectionHandler。< / p>

总而言之,如何在线程或任何其他异步方式中执行上述代码? 或者,当接收是while(true)循环时,您可能有任何其他建议同时运行发送和接收?

1 个答案:

答案 0 :(得分:4)

首先关闭 - 永远不要使用execute.get()。如果您认为需要使用它,那么您构建错误 - 它会破坏使用线程让调用线程等待结果的全部意义。如果你只是调用execute,你将在另一个线程上运行并正常工作。如果您需要真正同时运行多个线程,请使用executeOnExecutor()来覆盖AsyncTask的4.0共享线程池机制。

或者更好的是还没有使用AsyncTask。你有想要永远运行的东西,等待来自远程连接的输入。这比Thread更适合于AsyncTask。我使用一个线程并在线程中内置了while循环,并且只在连接关闭时让线程终止。