【问题标题】:How to check if there is any background task running?如何检查是否有任何后台任务正在运行?
【发布时间】:2015-10-31 15:40:38
【问题描述】:

我在 android 中有一个使用 AsyncTask 从服务器获取数据的活动,我正在运行如下任务:

new Task.exectue();

问题是这个 AsyncTask 有多个调用,我想在调用 onDestroyonBackPressed 时取消所有调用,我该如何实现?或者作为另一个灵魂,我如何检查活动中是否有任何后台任务正在运行?

【问题讨论】:

  • @Bubu 您是否建议我每次运行任务时都将其添加到列表中?请注意,我没有使用我总是使用新任务的对象来引用每个任务调用。执行我不知道这个任务会被调用多少次,也许一次可能一万次。
  • 是的,当你想取消它们时,你遍历你的列表,检查 AsyncTask 是否正在运行并为每个 asyncTask 取消它。如果你有一万个异步任务并行运行,这是另一个问题,你可能必须以不同的方式完成你的工作:)
  • @Bubu haha​​ 不,我不是说真的有一万个调用,只是用户可以点击同一个按钮调用任意多个任务。

标签: android android-activity android-asynctask


【解决方案1】:

默认情况下AsyncTask 串行执行许多任务。这意味着当第一个任务完成时,它会开始下一个任务,依此类推。你能做的是

全局变量:

private Task myTask;

方法:

public void accessWebService(){
   myTask = new Task().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, "Param 1");
}

然后在onDestroy 中取消任务。

【讨论】:

  • 当我每次都使用新任务而不将其附加到对象时,如何在 onDestroy 中取消它?
【解决方案2】:

如何检查活动中是否有任何后台任务正在运行?

   boolean isTaskRunning =  asyncTaskObj.getStatus().equals(AsyncTask.Status.RUNNING) ;

如果您想取消该任务,请使用以下代码:

asyncTaskObj.cancel(true);

【讨论】:

  • 我知道那个方法,但我没有用对象引用调用,这意味着我没有 asyncTaskObj,我总是使用 new Task.execute()
【解决方案3】:

有一个任务列表,当你想取消它们时,只需遍历列表并在每个任务上调用 .cancel() :

private ArrayList<Task> mTasks = new ArrayList<>();

每次您想执行 AsyncTask 时,将实例添加到您的列表中:

mTasks.add(new Task.exectue());

在任务的 onPostExecute() 方法结束时,将其从列表中删除:

@protected void onPostExecute(Long result) {
    ...
    mTasks.remove(this);
}

最后在你的 onDestroy() 方法中,取消所有正在运行的 AsyncTask :

@Override
onDestroy() {
    for(Task task : mTasks) {
        if(task.getStatus().equals(AsyncTask.Status.RUNNING)) {
            task.cancel(true);
        }
    }
}

【讨论】:

    猜你喜欢
    • 2014-03-22
    • 2017-07-21
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多