我在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)
循环时,您可能有任何其他建议同时运行发送和接收?
答案 0 :(得分:4)
首先关闭 - 永远不要使用execute.get()。如果您认为需要使用它,那么您构建错误 - 它会破坏使用线程让调用线程等待结果的全部意义。如果你只是调用execute,你将在另一个线程上运行并正常工作。如果您需要真正同时运行多个线程,请使用executeOnExecutor()来覆盖AsyncTask的4.0共享线程池机制。
或者更好的是还没有使用AsyncTask。你有想要永远运行的东西,等待来自远程连接的输入。这比Thread更适合于AsyncTask。我使用一个线程并在线程中内置了while循环,并且只在连接关闭时让线程终止。