2015-05-15 96 views
0

我编写了一个应用程序,通过tcp/ip连接到我的服务器。 (从教程中拿出原始代码,但是改变了它)Android:取消异步任务并重新启动

那里我有一个异步任务,我连接到我的服务器并等待消息。 所以这个任务永远不会停止。

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的实例功能调用重新连接() - 方法,我称之为重新连接() - 方法从我Mainclass,在那里我试图杀死异步任务,并重新启动它:

conTask.cancel(true); 
    conTask = null; 

    // disconnect 
    mTcpClient.setMRun(false); 
    mTcpClient.stopClient(); 
    mTcpClient = null; 

    conTask = new ConnectTask().execute(""); 

它工作正常,但突然重新连接时,应用程序停止运行,我不知道为什么。它重复地调用reconnect-Method,例如,如果WLAN关闭。如果我快速打开它,它就可以工作。但是,如果我等待太久,该应用程序已经崩溃。

所以我的最后一个问题是:如何从内部停止异步任务并重新启动它?显然我做错了什么。

我将不胜感激!

+0

我不知道答案,但在你的情况下,你不应该使用Asynctask等待太久。 “理想情况下,AsyncTasks应该用于短期操作(最多几秒钟)。” http://developer.android.com/reference/android/os/AsyncTask.html表示。 – Robust

回答

0

您遇到的问题是,您只需在doInBackground()的开头拨打if (isCancelled())即可。

我会假设你希望它成功取消reconnect()方法被调用的权利?

在这种情况下,尝试将reconnect()方法的所有内容封装在if (ConnectTask.this.isCancelled() != true)中,然后您可以选择从该方法返回,否则返回。

+0

但.isCancelled() - Value如何得到错误? – progNewbie

+0

你必须保持对你创建的'AsyncTask'对象的强有力的引用,比如''ConnectTask temp = new ConnectTask();'然后'temp.execute();'然后在某行之后(例如点击一个按钮)调用'temp.cancel(true);' – Yus

+0

是的,但它应该被取消时重新连接()被称为...所以我有点困惑 – progNewbie

0

其实从你的代码做AsyncTask.cancel()不会有什么好处。这种方法将导致isCancelled返回true,它应该用作doInBackground中的断路器。你没有运行任何循环,你的代码不会回到那个条件检查。

因此,如果我是你,我会首先评估是否需要有AsyncTask,因为它看起来你只是用它来开始mTcpClient。通过它的外观,它已经异步运行,因为你有附加的回调。 AsyncTask 异步任务,所以没有必要将AsyncTask包装在已经异步运行的东西上。显然最初的目标不是取消AsyncTask而是阻止这件事。如果确实需要AsyncTask,那么我会限制内部进程的生命周期。我不会使用异步但同步的方法将结果传递到onPostExecute,或者只是在doInBackground中结束它。在取消不可能的情况下,取消AsyncTask唯一要做的就是让它自行结束。