【发布时间】:2016-11-03 18:48:29
【问题描述】:
从 AsyncTask 中提取数据的最佳方法是什么?有没有更好的方法在后台管理数据?
到目前为止,这是我用来进行套接字通信和更改消息的函数:
public class MyClientTask extends AsyncTask<Void, Void, Void> {
String dstAddress;
int dstPort;
String response = "";
MyClientTask(String endereco, int porta) {
dstAddress = endereco;
dstPort = porta;
}
@Override
protected Void doInBackground(Void... arg0) {
try {
socket = new Socket(dstAddress, dstPort);
socketStatus = true;
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(1024);
byte[] buffer = new byte[1024];
int bytesRead;
InputStream inputStream = socket.getInputStream();
/*
* notice:
* inputStream.read() will block if no data return
*/
response = "";
while ((bytesRead = inputStream.read(buffer)) != -1) {
byteArrayOutputStream.write(buffer, 0, bytesRead);
response = byteArrayOutputStream.toString("UTF-8");
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
response = "UnknownHostException: " + e.toString();
socketStatus = false;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
response = "IOException: " + e.toString();
} finally {
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return null;
}
}
正如我所见,它的处理速度很快,但是如何使用 onPostExecute 从这段代码中提取“响应”?
【问题讨论】:
-
首先,您需要从
doInBackground实际返回一些内容,以便onPostExecute知道它。或者,可能有一些库可以在没有 AsyncTask 的情况下使套接字通信更容易 -
一个this answer 描述了
AsyncTask用于套接字操作,可能并不理想。
标签: java android sockets android-asynctask