Android

时间:2015-05-19 00:04:17

标签: java android design-patterns android-asynctask

我一直在Android中使用AsyncTask一段时间了。我喜欢它,因为你可以在后台线程上异步运行你想要的任何任务(通过任务我的意思是一段代码)。

一开始,每次异步运行和/或在后台线程上运行任务时,我都会将其代码捆绑到AsyncTask的扩展名中。我有时需要将这些任务中的多个链接起来(一个取决于另一个任务的结果)并在AsyncTask.onPostExecute(T data)中调用下一个任务(一旦执行完成),但现在我感觉我的代码被如此多的样板代码混乱( AsyncTask骨架)和连续任务的耦合。

最重要的是,我的AsyncTasks有时会从另一个AsyncTask启动,Android可能会抱怨。例如,如果我想在前/后执行中显示一些元素,那么在嵌套调用时这将是一个问题。

特别是,我正在寻找一种方法来模块化地选择任务是应该同步/异步,顺序/并行还是与其他任务一起运行。到目前为止,我的选择是使用简单的接口Task期望实现execute(T data)方法。然后我可以将它们中的一个或多个捆绑在一起,按顺序或并行运行,如下所示:

public doMultipleActions() {
  runTask(new MyFirstParallelTask(myFirstData)); // running asynchronously in parallel the first task
  runTask(new MySecondParallelTask(mySecondData)); // running asynchronously in parallel the second task

  runTask(new MyFirstSequentialTask(myThirdData, new MySecondSequentialTask(myFourthData, new DummyCallback()))); // running asynchronously sequentially the third and fourth tasks
}

即。 runTask(Task t)会将Task.execute(T data)的代码运行到AsyncTask.doInBackground(T... data)代码块中。顺序任务还期望在AsyncTask.onPostExecute(T data)代码块中执行另一个任务。

我查看了多个类似的问题:Can I chain async task sequentially (starting one after the previous asynctask completes)AsyncTask chaining in Activity (callback?)How to avoid chaining several AsyncTask calls?,大多数接近我的问题,但我找不到任何有用的东西,即使我不认为我是只有一个可以解决这个问题。

Android中AsyncTask的模块化使用是否有更好的方式,预期的方式,甚至是设计模式?

1 个答案:

答案 0 :(得分:1)

使用带参数executeOnExecutorAsyncTask.SERIAL_EXECUTOR的{​​{1}},可以以串行或并行方式运行多个AsyncTask。

如果您期望具有等待机制的结果(例如,等待任务完成并返回结果),那么更好的方法是使用Future。其中一个实现是FutureTask,它依赖于Callable,如下所示:

AsyncTask.THREAD_POOL_EXECUTOR

最后一行将阻止操作,直到Callable inside返回其String结果。实际上你甚至可以设置超时来完成它。

请记住,AsyncTask不会只执行异步操作。它还在后台线程上执行其过程。因此,您仍然可以使用AsyncTask(或Thread)来执行同步操作,否则会阻止UI。