2

假设我有具有静态列表任务的 TasksManager(不确定列表是否是好的解决方案)并且有静态方法addTaskToList(MyTask task){tasks.add(task);}, removeTaskFromList(MyTask task){tasks.remove(task);} doInBackground() 中的每个任务都调用第一个方法,而在 onPostExecute() 中还有第二个带有“this”的方法调用。MyTask 具有字符串字段“方法”。

我想取消此列表的任务,其中 task.getMethod().contains("url").. 不确定此代码是否足以稳定工作.. 看起来任务的 onCancelled() 并不总是被调用,多线程可能很危险对于我认为的这种方法。

   for (MyTask task : tasks) {
        if (task.getMethod().contains("url")) {
            task.cancel(true);
            break;
        }
    }

以这种方式存储任务是正常做法还是您可以建议我更优雅?

4

1 回答 1

0

取消 anAsyncTask并不总是立即/显而易见的事情。如果您正在使用cancel,您还需要确保doInBackground知道isCancelled并且您必须停止您自己正在做的事情(请参阅 文​​档isCancelled)。

我不建议存储AsyncTask对象列表并迭代它们以进行顺序后台工作。听起来它可能很快就会变得非常混乱。每个都会AsyncTask创建一个新Thread的 ,这听起来不像您想要的。相反,您可能只想要一个可以在其上执行操作的后台线程?

对于一个后台线程,您可以使用HandlerThread和您自己的 Looper,如下所示:

HandlerThread backThread = new HandlerThread("BackLooper", Thread.NORM_PRIORITY);
backThread.start();
Looper backLooper = backThread.getLooper();

private synchronized void runOnBackThread(Runnable r) {
   new Handler(backLooper).post(r);
}

然后,您希望按顺序运行的每个项目都可以通过提交一个Runnable. 而且,您也可以使用其他Handler post 变体,postDelayed、postAt 等。

而且,根据您正在做的事情,您可能会发现IntentService 非常有帮助。IntentService专门为“工作队列”类型模式提供。它有一个后台线程,当你调用它时,它会做任何你告诉它做的事情,当你不需要它时它会自行消失。

最后,如果您正在为 Android 寻找一个非常好的通用“任务”类型库,请查看 Square 的Tape。这与您的问题没有直接关系,但我发现 Tape 对于更强大的“排队”任务类型情况非常方便。

于 2013-01-17T20:11:23.883 回答