Honeycomb
和 v4 兼容库
,我们就可以使用 AsyncTaskLoader
。据我所知,AsyncTaskLoader
可以在屏幕旋转等配置变化时仍然保持存活。
那么使用 AsyncTaskLoader
是否比使用 AsyncTask
更好呢?是否也涉及到使用 LoaderManager
?但是我没有找到有关如何正确使用
AsyncTaskLoader
的好例子,文档中也没有提供任何示例。谁能提供一些好的例子呢?Honeycomb
和 v4 兼容库
,我们就可以使用 AsyncTaskLoader
。据我所知,AsyncTaskLoader
可以在屏幕旋转等配置变化时仍然保持存活。
那么使用 AsyncTaskLoader
是否比使用 AsyncTask
更好呢?是否也涉及到使用 LoaderManager
?AsyncTaskLoader
的好例子,文档中也没有提供任何示例。谁能提供一些好的例子呢?比较 AsyncTaskLoader 和 AsyncTask,你可能知道,当你旋转设备屏幕时,它可能会销毁并重新创建你的活动。为了更清楚地说明这一点,让我们想象一下在进行网络交易时旋转设备:
AsyncTask 将再次作为后台线程重新执行,而先前的后台线程处理将只是冗余和僵尸。
AsyncTaskLoader 将基于之前注册在 Loader 管理器中的 Loader ID 进行重用,因此避免了重新执行网络事务。
总之,AsyncTaskLoader 防止后台线程的重复和消除僵尸活动的重复。
FragmentActivity
的作用是:
LoaderManager
列表onRetainNonConfigurationInstance()
保存实例,以确保它们在您翻转手机(或发生其他配置更改)时不会被销毁initLoader()
时启动正确的 loaderLoaderManager
来接口操作加载器,并提供所需的回调来创建您的 loader(s) 并使用其返回的数据填充您的视图。AsyncTask
,使用 LoaderManager
应该更容易。但是,AsyncTaskLoader
的文档并不是非常好,因此您应该研究文档中的示例和/或基于 CursorLoader
来编写您的代码。AsyncTaskLoader 与 AsyncTask 有相同的功能,但更加优秀。它可以更容易地处理 Activity 配置更改,并在 Fragment 和 Activity 的生命周期内运行。优美的是,任何应用了 AsyncTask 的情况都可以使用 AsyncTaskLoader。每当需要将数据加载到内存中供 Activity/Fragment 处理时,AsyncTaskLoader 可以更好地完成工作。
然而,使用 AsyncTasks 会遇到以下几个问题:
AsyncTaskLoader允许我们在新数据通过forceLoad()
返回之前加载旧的缓存数据。
我们可以使用setUpdateThrottle()
设置延迟时间,以防止连续更新到客户端(Activity/Fragment)。
AsyncTaskLoader可以被多个片段共享,如果它们有共同的父活动,并且它是从getActivity().getSupportLoaderManager()
启动的。
AsyncTaskLoader在链接的活动不可用时,会被LoaderManger
销毁。而我们需要手动销毁AsyncTasks,如果它的调用活动已经被销毁。这样可以省去我们编写所有清除内容的时间。 AsyncTaskLoader与它们各自的生命周期很好地协同工作。
AsyncTaskLoader
的好例子还为时过早,当更多的开发者开始使用它时,会有更多的例子出现。 - OKA