一尘不染

API级别11之前的AsyncTask.executeOnExecutor()

javascript

我们在Android中执行AsyncTask的正常方法是通过Android API:

 private class DoIntenseTask extends AsyncTask<Object, Object, Void> {
   protected Void doInBackground(Object... params) {
     for (Object param : params) {
         Object rtnObj = doIntenseJob(param);
         publishProgress(rtnObj);
     }
     return null;
   }

   protected void onProgressUpdate(Object... progress) {
     for (Object rtnObj : progress) {
       updateActivityUI(rtnObj);
     }
   }

 }

我的繁重任务是松散耦合的,执行顺序无关紧要,通过这样做,分配了一个线程来运行一系列繁重任务。我个人认为这是一种半途而废的解决方案。是的,繁重的工作不再在UI线程中运行,但是仍然需要一个一个地执行(在许多情况下,我们面临着一系列繁重的工作,我认为这也是AsyncTask中的方法具有多个参数的原因)。Google应该使该API更可重用,以解决不同类型的情况。

我真正想拥有的是由线程池并行管理多个doIntenseJob()(例如poolSize = 5)。看起来Google确实通过AsyncTask.executeOnExecutor()提供了一种解决方案,但不幸的是,仅从API级别11开始提供。我正在开发移动设备上的应用程序,不知道是否有解决方法可以在API级别11下实现相同的行为。

在此先感谢


阅读 347

收藏
2020-09-28

共1个答案

一尘不染

我的繁重任务是松散耦合的,执行顺序无关紧要,通过这样做,分配了一个线程来运行一系列繁重任务。

AsyncTask目前使用具有多个线程的线程池。将来,它可能仅限于一个线程-Google暗示情况将会如此。

想知道是否有解决方法可以在API级别11下实现相同的行为。

默认行为是所需的行为。如果您查看的源代码AsyncTask,您将看到,从Gingerbread开始,它使用的线程池至少包含5个线程,最多包含128个线程。

现在,记住,在浩瀚目前使用的大多数Android设备都是单核。因此,除非您的“紧张任务”没有做很多事情而是阻塞了网络I / O,否则您不希望并行执行这些任务,因为线程之间的上下文切换只会使您进一步放慢速度。

2020-09-28