我有许多AsyncTask
个实例正在从服务器下载一些不同的内容。他们在执行者身上运行:
final GetStationsTask getStationsTask = new GetStationsTask();
getStationsTask
.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, URL_STATIONS);
目前我有3个AsyncTask
的子类,但这个数字不会保持不变。我也正在为因各种原因未完成的任务实现某种重试,如果至少有一项任务未正确完成(未收到数据),我想从头开始下载所有内容:
// mHandler = new Handler(); // an instance variable
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
if (!allDataSet()) {
// here I want to cancel the tasks that are still running
// and rerun all of them
}
}
}, 30000); // I give all the tasks 30 seconds to complete
为此,我想我需要知道哪些任务当前正在运行,哪些任务已正确完成以及哪些任务已被取消,因为如果所有任务都重新启动,我需要先取消正在运行的任务以防止数据被删除多次收到。任何想法如何解决?
答案 0 :(得分:2)
覆盖基础AsyncTask,并将其用作所有AsyncTasks的基类。让覆盖任务具有运行,已取消和已完成任务的静态列表。然后将每个任务添加到基类方法中的相关列表中。
答案 1 :(得分:2)
您可以保留当前在某些单例类中执行的AsyncTasks列表,即。申请延期一:。
List<AsyncTask<String, String, String>> downloadsAsycs = new ArrayList<AsyncTask<String, String, String>>();
在你的asynctask的onPostExecute中使用downloadsAsycs.remove(this)
将其从列表中删除。请记住要么使用此列表进行同步,要么始终在UI线程上修改/读取它,即。来自mainlooper或onPreExecute / onPostExecute的Handler。您可以使用AsyncTask.getStatus()
检查异步任务的状态。过了一会儿它开始变得复杂。
您也可以从AsyncTask切换到Executors.newFixedThreadPool和ExecutorService.invokeAll。您可以调用所有任务并返回所有可以控制它们的Future。您甚至可以在某些反向线程(甚至asynctask.doInBackground)上使用Future.get超时到30秒,如果操作超时,则在此之后使用Future.cancel。
答案 2 :(得分:1)