我正在Android中开发一个使用TCP套接字连接到服务器的应用程序。 我正在使用AsynkTask来连接应用程序。
应用程序在其整个生命周期中不会与服务器断开连接。即使应用程序进入休眠状态,AsynkTask仍会继续运行,并且套接字始终处于连接状态。
仅当服务器关闭套接字时(因为异常被抛出并且doInBackground()完成)或者当用户退出应用程序时(因为AsyncTask被取消),Socket才会断开连接
这是我的doInBackground()
@Override
public Void doInBackground(Void ...pa){
try {
sock = new Socket(InetAddress.getByName(serv), port);
}
catch(IOException ex) { errMessage = ex.getMessage() + "\n"; }
try {
if(sock != null) {
inStr = new DataInputStream(sock.getInputStream());
outStr = new DataOutputStream(sock.getOutputStream());
while(!isCancelled()) {
if(((hbDataSize = inStr.read()) & 0xC0) == 0xC0){
lbDataSize = inStr.read();
packetSize = (hbDataSize << 8 & 0x3F00) + lbDataSize;
buffer = new byte[packetSize-2];
inStr.read(buffer, 0, packetSize-2);
publishProgress(0);
}
}
} else {
throw new IOException(errMessage);
}
}catch(IOException e) { // sin conexion salta a a excepcion
errMessage = e.getMessage();
publishProgress(2);
isError = true;
}
return null;
}
无论如何,我只是放置代码,以便您可以看到方法。
我开始阅读有关AsyncTask的内容,它说我应该长时间使用AsyncTask。
理想情况下,AsyncTasks应该用于短操作(最多几秒钟。)如果需要保持线程长时间运行,强烈建议您使用java.util.concurrent提供的各种API。包,如Executor,ThreadPoolExecutor和FutureTask。
我的应用程序工作正常,但我应该更改Executor的AsyncTask,还是ThreadPoolExecutor或FutureTask? 如果你认为我应该改变它,我为什么要改变它? 我一直在阅读关于这三个条款的内容,但如果我应该改变它,我就不会感到害羞。
答案 0 :(得分:4)
如果你正在做你所描述的连续工作,最好使用服务,android将通过服务更好地管理资源。正如你所说,即使应用程序进入睡眠状态,(你的意思是设备吗?)。服务框架或包旨在执行此类操作。 AsyncTask用于次要下载操作,如图像和其他东西。但是,如果您依赖来自云服务的连续流,那么请使用服务。