这可能看起来像一个愚蠢的问题,但我不能围绕AsynctaskLoader的状态。
我已多次阅读文档,以及网络上的其他教程。但是,我仍然无法理解Asynctask何时处于重置状态
看一下从官方文档中提取的这段代码。 http://developer.android.com/reference/android/content/AsyncTaskLoader.html
@Override public void deliverResult(List<AppEntry> apps) {
if (isReset()) {
// An async query came in while the loader is stopped. We
// don't need the result.
if (apps != null) {
onReleaseResources(apps);
}
}
调用此方法然后Loader完成其工作并需要将数据发送回UI线程。我的问题是:为什么我们要问装载机是否重置?它重置后甚至意味着什么?班上说
/**
* Return whether this load has been reset. That is, either the loader
* has not yet been started for the first time, or its {@link #reset()}
* has been called.
*/
您认为如果装载机第一次没有启动,它会处于STOPPED状态,为什么重新启动?
我想我并不真正理解Loader对Activity Lifecycle的反应,但是文档没有说明这一点。
答案 0 :(得分:4)
答案 1 :(得分:2)
&#34;但是,我仍然无法理解Asynctask何时处于重置状态&#34;
我相信你的意思是......当LOADER处于休息状态时#34;
通常会使用LoaerManager来管理加载器的生命周期。
当用户调用LoaderManager#destroyLoader()时,LoadManager会从其缓存中删除此加载器。 当调用LoaderManager #re restartLoader()或者Activity / Fragment经历它的销毁阶段时,也可能会破坏加载程序。 如果此类加载器先前已将数据传递给其客户端(通常为Fragment或Activity),则LoaderManager将调用onLoaderReset()并指示加载程序重置。 这为客户提供了删除对数据的任何引用以及加载器释放与数据相关的任何资源的机会。 记住数据的所有者是加载器而不是客户端。
&#34;我的问题是:我们为什么要问装载机是否重置?&#34;
deliverVesult在UI线程的上下文中调用,但是由完成实际加载的后台线程触发。 在后台线程完成之前,可以将加载器状态更改为reset()。 执行检查isReset()以避免在加载器处于复位状态的竞争条件情况下通知客户端新数据。
&#34;它重置后甚至意味着什么?&#34;
处于重置状态的加载器应该停止其所有操作,因为它可能在不久之后被销毁。 特别是它应该释放以前加载的数据占用的任何资源,停止加载新数据并监视下划线数据源的变化。
&#34;您认为如果装载机第一次没有启动,它会处于STOPPED状态,为什么重新启动?&#34 强>
停止状态表示加载程序先前处于启动状态。 在停止状态下,加载程序可能具有先前加载的数据,并且应监视下划线数据源中的更改。 从Stopped状态,加载程序可以返回到启动状态或重置状态。 如果它重新启动,那么如果数据源在停止时没有任何变化,它可能会使用之前加载的数据。
创建加载程序但在启动加载程序之前,它被视为处于重置状态。 这很有效,因为在这种状态下还没有加载的数据,加载器也不应该执行上面提到的任何操作。