13

我想知道停止异步任务 frm 运行的最佳方法是什么。

我试过了

@Override protected void onCancelled() { 
      super.onCancelled(); 
      mTask.cancel(true);       
 }

我也试过

asyncTaskObject.cancel(true);

这在与事件关联时特别有效。

但是假设场景是---有4个AsyncTask。第一次调用第二次,第二次调用第三次,第三次调用第四次。当用户进入活动时,没有对话框。否则我们可以在那里使用 onCancel 方法。当用户单击页面上的任何位置时,如果用户没有单击任何位置,则会出现对话框,则不会显示对话框,但异步任务会在后台继续运行。假设用户单击“返回”按钮或导航图标到主页页面 user.is 从当前活动中取出。但是异步任务继续在后台运行,最终应用程序崩溃。我已经习惯了 onBackPressed 中的取消方法。但问题是您无法确定哪个任务正在运行并且应用程序再次崩溃。

解决这个问题的方法是什么?

4

3 回答 3

19

保持对 AsyncTask 对象的引用作为实例变量,然后在 onDestroy() 中执行此操作

@Override
protected void onDestroy() {
    if (mTask != null) {
        mTask.cancel(true);
    }

    super.onDestroy();
}
于 2012-11-27T13:18:54.787 回答
4

http://developer.android.com/reference/android/os/AsyncTask.html中有一个称为线程规则的会话,它说 AsyncTasks 实例必须在 UI 线程上创建并且必须在 UI 线程上调用执行。如果您从 UI 线程调用执行,您可以取消调用 yourTaskInstance.cancel(true); 的线程

于 2012-11-27T13:24:43.847 回答
0

我不完全确定何时要取消任务,但这里有一些建议: a) 保留对正在运行的每个任务的引用。b)在您的对话框中添加一个关闭侦听器并取消那里的所有任务(如果这是您想要做的)。c) 在您的活动的 onStop 回调中取消所有任务(如果您想再次这样做)。

于 2012-11-27T13:22:28.150 回答