【问题标题】:Android Async task cancel/stopAndroid 异步任务取消/停止
【发布时间】:2012-11-27 13:14:28
【问题描述】:

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

我试过了

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

我也试过了

asyncTaskObject.cancel(true);

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

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

解决办法是什么?

【问题讨论】:

    标签: android events android-asynctask


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      的线程

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-07-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-06
          • 1970-01-01
          • 2014-08-24
          相关资源
          最近更新 更多