我编写了一个应用程序,通过tcp / ip连接到我的服务器。 (从教程中获取原始代码,但更改了它)
我有一个Async-Task,我连接到我的服务器并等待消息。 所以这个任务永远不会停止。
我从以下开始:
conTask = new ConnectTask().execute("");
任务看起来像这样:
public class ConnectTask extends AsyncTask<String, String, TcpClient> {
@Override
protected TcpClient doInBackground(String... message) {
if (isCancelled()) {
Log.d("async", "ASYNC CANCELED!!!");
return null;
}
//we create a TCPClient object and
mTcpClient = new TcpClient(new TcpClient.OnMessageReceived() {
@Override
public void reconnect()
{
Log.d("recon", "here i can try to reconnect");
reConnect();
}
@Override
//here the messageReceived method is implemented
public void messageReceived(String message) {
//this method calls the onProgressUpdate
if (message.equals("connected"))
{
...
}
}
});
mTcpClient.run();
return null;
}
}
问题是,当连接失败或中断时,我尝试重新连接。 如果发生这种情况,我的TcpClient-Instance调用reconnect() - 我从我的Mainclass调用reConnect() - Method的方法,我尝试杀死Async-Task并重新启动它:
conTask.cancel(true);
conTask = null;
// disconnect
mTcpClient.setMRun(false);
mTcpClient.stopClient();
mTcpClient = null;
conTask = new ConnectTask().execute("");
它工作正常,但突然重新连接时,应用程序停止运行,我不知道为什么。它会重复调用reconnect-Method,例如WLAN关闭时。如果我快速打开它,它就可以工作。但如果我等了太久,该应用程序已经崩溃了。
所以我的最后一个问题是:如何从内部停止Async-Task并重新启动它?显然我做错了。
我会感激一些帮助!
答案 0 :(得分:0)
您遇到的问题是,您只能在if (isCancelled())
开头调用doInBackground()
。
我会假设您希望在调用reconnect()
方法时成功取消?
在这种情况下,请尝试将reconnect()
方法的所有内容封装在if (ConnectTask.this.isCancelled() != true)
中,然后您可以选择从该方法返回。
答案 1 :(得分:0)
实际上,从您的代码中AsyncTask.cancel()
执行任务都不会有任何好处。此方法将导致isCancelled
返回true,并且它应该在doInBackground
中充当循环断路器。您没有运行任何循环,您的代码将不会返回到该条件检查。
所以,如果我是你,我首先会评估是否需要使用AsyncTask,因为它看起来只是用它来启动mTcpClient
。从它的外观来看,它已经异步运行,因为你附加了回调。 AsyncTask 是异步任务,所以没有必要在已经异步运行的东西上包装AsyncTask。显然,最初的目标不是取消AsyncTask而是取消这个事情。如果确实需要AsyncTask,那么我将限制进程内部的生命周期。我不会使用异步但同步的方法将结果传递给onPostExecute
,或者只是在doInBackground
中结束它。在取消不可能的情况下,取消AsyncTask唯一要做的就是让它自己结束。