我听说有一些新的解决方案可以在后台加载数据,比AsyncTask更推荐(比如loaders)。
AsyncTasks很棒且易于使用。但是,它有一些限制:
类本身必须进行修改,因为它受待处理任务数量的限制(约256左右)。当然,在listView的适配器中,如果不需要,我总是取消任务(例如,当我需要更新用于其他项目的视图时)。
我还必须在重新创建活动/片段时全部取消它们(或以不同的方式处理)。
由于1& 2,我需要管理它们并引用所有这些
AsyncTask使用任务队列,有时我需要使用堆栈,所以我必须创建自己的AsyncTask类,而不是使用堆栈。
是否有AsyncTask的替代品?
我知道之前在某些帖子中提到了这个问题(比如here),但我在想是否有一种新的通用方法可以在后台加载数据来替换asyncTask。
关于Loaders,我认为这个想法是它们用于数据库和contentProviders,但它们是否也可以用于从Internet上加载(例如)数据(如图像文件)?
还有一个很好的样本由谷歌(here制作,名为“bitmapFun”),根据我所看到的使用AsyncTask(甚至扩展它,可能是因为我提到的相同原因) 。但也许我也错过了一些东西?
答案 0 :(得分:2)
是
加载器是托管AsyncTasks。如果您没有使用Loader,那么您可能错过了他们需要的管理。
AsyncTasks(和Loaders)是一种非常糟糕的方式来获取设备上的东西。要从远程服务器获取数据,请查看使用IntentService。请参阅:https://www.youtube.com/watch?v=xHXn3Kg2IQE
答案 1 :(得分:2)
也许您应该考虑检查您的方法,根据视图执行多个更新的需求,并取消之前视图中的所有待处理任务,给人的印象是您为每个需要的视图单独执行数据加载要被创造。
在带有列表适配器的列表视图中,通常的方法是根据需要或在一个目标中加载一部分数据(作为ValueObject列表或作为多个数据库行的Cursor),而不是逐项分页。因此,如果您希望更新下一页,您基本上只执行一个操作,使用AsyncTask或Loaders将新项目提取到模型,然后使UI可用于显示它们。这样,您将应用MVC,并且您将无法取消和控制多个待处理任务,并且您的结构将更加稳固且易于管理。
关于替代方案,如果您正在处理数据库,最直接的方法是使用CursorLoader,即loaders而不是AsyncTask,但如果您正在处理来自的数据从网络或文件系统,您可以自由选择各种其他选项。 AsyncTask使用起来要简单得多,主要建议用于简单的事情或一次性查询。但您也可以使用加载程序执行此类任务,请参阅AsyncTaskLoader。
答案 2 :(得分:1)
AsyncTask旨在成为Thread和Handler的辅助类,并不构成通用的线程框架。理想情况下,AsyncTasks应该用于短操作(最多几秒钟。)如果需要保持线程长时间运行,强烈建议您使用java.util.concurrent pacakge提供的各种API,例如Executor,ThreadPoolExecutor和FutureTask。有关详细信息,请参阅http://developer.android.com/reference/android/os/AsyncTask.html。
asynctask的替代方案是robospice。https://github.com/octo-online/robospice。
你可以在这里开始使用robopice。 https://github.com/octo-online/robospice/wiki/Starter-Guide
https://play.google.com/store/apps/details?id=com.octo.android.robospice.motivations&feature=search_result的robospice样本。
robospice的一些功能。
1.executes asynchronously (in a background AndroidService) network requests (ex: REST requests using Spring Android).
2.is strongly typed ! You make your requests using POJOs and you get POJOs as request results.
3.enforce no constraints neither on POJOs used for requests nor on Activity classes you use in your projects.
4.caches results (in Json with both Jackson and Gson, or Xml, or flat text files, or binary files, even using ORM Lite).
5.notifies your activities (or any other context) of the result of the network request if and only if they are still alive
6.no memory leak at all, like Android Loaders, unlike Android AsyncTasks notifies your activities on their UI Thread.
7.uses a simple but robust exception handling model.