首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >执行背景任务-替代AsyncTask?

执行背景任务-替代AsyncTask?
EN

Stack Overflow用户
提问于 2017-02-01 04:13:45
回答 3查看 6.9K关注 0票数 9

我希望在应用程序中有各种异步线程,比如,大约5-10个线程,用于后台任务,这些任务可以是、长时间运行的(比如流),如果需要的话,我还要更新UI以发布一些结果。

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

  • 长期运行的任务,
  • 与活动生命周期联系得很差,
  • 设备定向问题,以及
  • 内存泄漏等等。

因此,我正在寻找一种替代方案(可能不使用任何第三方库),它不存在上述问题。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-02-01 04:51:12

在大多数情况下,AsyncTask应该能够满足需求。但是,有些情况下不能使用AsyncTask。ie AsyncTask管理线程池,从中提取要由任务实例使用的线程。现在,线程池假设在一段合理的时间后,它们将返回它们的线程。因此,在不知道需要线程多长时间的场景中,您不能使用AsyncTask。而在Android4.4中,线程池的大小只能增长到:(no of CPU cores * 2) + 1。因此,在双核处理器上,可以创建的最大线程数限制在5个。

因此,我正在寻找一种替代方案(可能不使用任何第三方库),它不存在上述问题。

谈到AsyncTask的替代方案,以下是可用的选项:

  • 处理程序
  • 可运行

现在,所有背景线程都有缺点,不管它们的插图有多漂亮,但很少包括:

  • 后台线程处理过程中用户交互的可能性。如果后台线程执行的工作发生了更改,则需要将其传递回后台线程。在这些场景中,java.util.concurrent有许多类可以帮助。
  • 进程本身在线程执行任务时被终止的可能性。因此,在这些情况下,与使用AsyncTask或更简单的Thread不同,ServiceIntentService将是理想的选择。
  • 如果后台线程中可能出现错误,例如当连接丢失时从服务器检索数据,则需要手动关闭后台线程。

简而言之:无论你选择哪一个选项,你都需要手动处理所有的角落案例,这样应用程序才能高效而出色地工作。

PS:引文:Android开发繁忙的程序员指南v5.8 by @Commonsware,它是在非商业共享许可下发布的

票数 6
EN

Stack Overflow用户

发布于 2017-02-01 04:32:14

  • 长期运行的任务,
  • 与活动生命周期联系得很差,
  • 设备定向问题,以及
  • 内存泄漏等等。

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

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

或者,您可以阅读文章来了解服务(如果您还不知道),并查看它们是否适合您的场景。

票数 3
EN

Stack Overflow用户

发布于 2017-02-01 06:07:06

我首先建议使用上述组件,

  1. 操作者
  2. Runnables

如果操作是长时间运行的,那么您可以选择服务,因为它一直在运行。你说过

它可以长时间运行(比如流)

如果您正在播放一些音频或视频,那么最好根据您的需求使用普通的ServiceIntent Service服务。

您可以在需要时销毁该服务,也可以在需要时让Android系统进行销毁。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41971777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档