执行后台任务 - AsyncTask的替代方案?

时间:2017-02-01 04:13:45

标签: java android multithreading android-asynctask

我希望在应用程序中有各种异步线程,例如大约5-10个线程用于后台任务,这些任务可以长时间运行(如流式传输),而且我也更新用户界面以在必要时发布一些结果。

据我所知,AsyncTask存在以下问题:

  • 长时间运行的任务,
  • 很难与活动生命周期联系在一起,
  • 设备方向问题和
  • 内存泄漏等。

所以,我正在寻找一种没有上述问题的替代方案(可能没有使用任何第三方库)。

使用简单Java线程我应该更好吗?我不介意使用它们,因为它们不会给AsynTask带来任何问题。

3 个答案:

答案 0 :(得分:5)

在大多数情况下,AsyncTask应该满足要求。但是,有些情况下无法使用AsyncTask。 ie AsyncTask管理一个线程池,从中拉出线程池供任务实例使用。现在,线程池假设他们将在一段合理的时间后恢复其线程。因此,在您不知道线程需要多长时间的情况下,您无法使用AsyncTask。从Android 4.4开始,线程池的大小只能增长到:(no of CPU cores * 2) + 1。因此,在双核处理器上,您可以创建的最大线程数限制为5.

  

所以,我正在寻找一种没有上述问题的替代方案(可能没有使用任何第三方库)。

来到AsyncTask的替代方案,这些是可用选项:

  • 处理程序
  • 可运行

现在所有背景线程都有缺点,无论它们有多么精美,很少包括:

  • 后台线程正在处理时用户交互的可能性。如果后台线程执行的工作被更改,则需要将其传回给后台线程。 java.util.concurrent有许多课程可以帮助解决这些问题
  • 在线程执行任务时进程本身被杀死的可能性。因此,在这些情况下,而不是使用AsyncTask或更简单的ThreadServiceIntentService将是理想的选择。
  • 在后台线程内发生错误的可能性,例如在连接丢失时从服务器检索数据,您需要手动关闭后台线程。
  

简而言之:无论您选择哪种选项,都需要手动处理   为应用程序的高效和精彩工作提供所有角落案例。

<强> PS: [引用]:The busy coder's guide to Android development v5.8由@Commonsware发布,根据知识共享署名非商业性共享4.0许可证发布

答案 1 :(得分:2)

  • 长时间运行的任务,
  • 很难与活动生命周期联系在一起,
  • 设备方向问题和
  • 内存泄漏等。
  

简单的java线程不会解决任何这些问题。特别是,内存泄漏。

如果您只想在后台加载数据,可以考虑Loaders。它们可以缓存数据应用程序,并且非常适合活动/片段生命周期。

或者,您可以浏览this文章了解服务(如果您还不知道)并查看它们是否适合您的方案。

答案 2 :(得分:0)

我首先建议使用上面提到的组件,

  1. 处理程序
  2. 的Runnable
  3. 如果操作长时间运行,那么您可以继续运行以获得服务。你说

      

    可以长时间运行(如流媒体)

    如果您通过某些音频或视频进行直播,则最好使用普通ServiceIntent Service服务,具体取决于您的要求。

    您可以在需要时销毁服务,或者让Android系统在需要时执行此操作。

    因此我建议您在这种情况下使用服务。