我希望在应用程序中有各种异步线程,例如大约5-10个线程用于后台任务,这些任务可以长时间运行(如流式传输),而且我也更新用户界面以在必要时发布一些结果。
据我所知,AsyncTask存在以下问题:
所以,我正在寻找一种没有上述问题的替代方案(可能没有使用任何第三方库)。
使用简单Java线程我应该更好吗?我不介意使用它们,因为它们不会给AsynTask带来任何问题。
答案 0 :(得分:5)
在大多数情况下,AsyncTask
应该满足要求。但是,有些情况下无法使用AsyncTask
。 ie AsyncTask
管理一个线程池,从中拉出线程池供任务实例使用。现在,线程池假设他们将在一段合理的时间后恢复其线程。因此,在您不知道线程需要多长时间的情况下,您无法使用AsyncTask
。从Android 4.4开始,线程池的大小只能增长到:(no of CPU cores * 2) + 1
。因此,在双核处理器上,您可以创建的最大线程数限制为5.
所以,我正在寻找一种没有上述问题的替代方案(可能没有使用任何第三方库)。
来到AsyncTask
的替代方案,这些是可用选项:
现在所有背景线程都有缺点,无论它们有多么精美,很少包括:
java.util.concurrent
有许多课程可以帮助解决这些问题AsyncTask
或更简单的Thread
,Service
或IntentService
将是理想的选择。简而言之:无论您选择哪种选项,都需要手动处理 为应用程序的高效和精彩工作提供所有角落案例。
<强> PS:强> [引用]:The busy coder's guide to Android development v5.8由@Commonsware发布,根据知识共享署名非商业性共享4.0许可证发布
答案 1 :(得分:2)
简单的java线程不会解决任何这些问题。特别是,内存泄漏。
如果您只想在后台加载数据,可以考虑Loaders。它们可以缓存数据应用程序,并且非常适合活动/片段生命周期。
或者,您可以浏览this文章了解服务(如果您还不知道)并查看它们是否适合您的方案。
答案 2 :(得分:0)
我首先建议使用上面提到的组件,
如果操作长时间运行,那么您可以继续运行以获得服务。你说
可以长时间运行(如流媒体)
如果您通过某些音频或视频进行直播,则最好使用普通Service
或Intent Service
服务,具体取决于您的要求。
您可以在需要时销毁服务,或者让Android系统在需要时执行此操作。
因此我建议您在这种情况下使用服务。