【发布时间】:2014-01-13 11:42:13
【问题描述】:
我一直在寻找我的问题的答案,但到目前为止,没有一个解决方案可以帮助我解决它。我正在开发一个与另一个作为服务器工作的设备通信的应用程序。应用程序向服务器发送查询并接收适当的响应以动态创建片段。
在第一个实现中,应用发送查询,然后在单个线程中等待接收答案。但该解决方案并不令人满意,因为该应用程序没有收到来自服务器的任何反馈。服务器管理员说他正在接收查询,但他暗示设备发送回答案的速度太快了,并且在答案到达时应用程序可能还没有收听。
所以我想要实现的是创建单独的线程:一个用于侦听,一个用于发送查询。监听会在我们向服务器发送任何内容之前启动,以确保应用不会错过服务器响应。
到目前为止,实施这一点还没有成功。我尝试编写和运行单独的 Runnable 类和 AsyncTasks,但侦听器从未收到答案,并且在某些时候其中一个线程甚至没有执行。这是异步任务监听器的代码:
@Override
protected String doInBackground(String... params) {
int bufferLength = 28;
String masterIP = "192.168.1.100";
try {
Log.i("TCPQuery", "Listening for ReActor answers ...");
Socket tcpSocket = new Socket();
SocketAddress socketAddress = new InetSocketAddress(masterIP, 50001);
try {
tcpSocket.connect(socketAddress);
Log.i("TCPQuery", "Is socket connected: " + tcpSocket.isConnected());
} catch (IOException e) {
e.printStackTrace();
}
while(true){
Log.i("TCPQuery", "Listening ...");
try{
Log.i("TCPQuery", "Waiting for ReActor response ...");
byte[] buffer = new byte[bufferLength];
tcpSocket.getInputStream().read(buffer);
Log.i("TCPQuery", "Received message " + Arrays.toString(buffer) + " from ReActor.");
}catch(Exception e){
e.printStackTrace();
Log.e("TCPQuery", "An error occured receiving the message.");
}
}
} catch (Exception e) {
Log.e("TCP", "Error", e);
}
return "";
}
这就是任务的调用方式:
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB) {
listener.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, "");
sender.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, "");
}
else {
listener.execute();
sender.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
您将如何解决这个问题?如果此代码还不够,我很乐意发布更多内容。
【问题讨论】:
-
我忘了说运行单个线程,无论是侦听器还是发送者都可以正常工作。
标签: java android multithreading tcp android-asynctask