2015-10-31 61 views
2

我在Android的一个活动,使用的AsyncTask获取来自服务器的数据,我正在像以下任务:如何检查是否有任何后台任务正在运行?

new Task.exectue(); 

的问题是有这个的AsyncTask多个呼叫,我想取消所有当他们拨打onDestroyonBackPressed时,我该如何做到这一点?或者作为另一个版本,我如何检查是否有任何后台任务正在运行?

+0

可能的重复:http://stackoverflow.com/questions/12971882/cancel-all-asynctask – Bubu

+0

@Bubu你是否建议我每次运行一个任务,我将它添加到列表中?请知道,我没有引用每个任务调用的对象,我总是使用新的task.execute,我没有多少次这个任务将被称为可能一次,也许一万。 – EyadMhanna

+0

是的,当你想取消它们时,你遍历你的列表,检查AsyncTask是否正在运行,并取消它的每个asyncTask。如果你有一万个asyncTask并行运行,这是另一个问题,你可能需要以不同的方式完成你的工作:) – Bubu

回答

2

默认AsyncTask连续执行许多任务。这意味着当第一个任务完成时,它将启动下一个任务,依此类推。你可以做的是

全局变量:

private Task myTask; 

方法:

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

,然后在onDestroy取消任务。

+0

当我每次使用新任务时,如何在onDestroy中取消它,而不将它附加到对象上? – EyadMhanna

+0

检查我更新的答案 –

1

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

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

如果要取消任务,然后在下面的代码中使用:

asyncTaskObj.cancel(true); 
+0

我知道这种方法,但我没有用对象来引用调用,这意味着我没有asyncTaskObj,我总是使用新的Task.execute() – EyadMhanna

1

有您的任务列表,当你要取消他们只是通过列表迭代,并调用.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); 
     } 
    } 
} 
相关问题