这似乎是个愚蠢的问题,但我无法理解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.
*/ 您可能会认为,如果加载程序还没有第一次启动,它将在停止声明中,为什么要重新启动?
我想我并不真正理解Loader对活动生命周期的反应,但是文档中没有提到它。
发布于 2015-01-15 18:55:59
“然而,我仍然无法理解Asynctask何时处于重置状态”
我相信你的意思是"...when装载机在其他州“
通常,人们会使用LoaerManager来管理装载机的生命周期。
当用户调用LoaderManager#destroyLoader()时,LoadManager会从它的缓存中删除这个加载程序。当调用LoaderManager#restartLoader()或活动/片段经过销毁阶段时,加载程序也可能被销毁。如果这种加载程序以前将数据传递给它的客户端(通常是片段或活动),那么LoaderManager将调用onLoaderReset()并指示加载程序重置。这为客户端提供了一个机会,可以删除对数据的任何引用,并为加载程序释放与数据相关的任何资源。记住,数据的所有者是加载程序,而不是客户端。
“我的问题是:为什么我们要问装载机是否被重置?”。
deliverResult在UI线程的上下文中调用,但由完成执行实际加载的后台线程触发。在后台线程完成之前,可以将加载程序状态更改为重置()。执行check isReset()是为了避免在加载程序处于重置状态的竞争条件下通知客户端新数据。
“它对重置意味着什么?”
处于重置状态的加载程序应该停止其所有操作,因为它可能很快就会被销毁。特别是,它应该释放与以前加载的数据占用的任何资源,停止加载新数据并监视下划线数据源中的更改。
“您可能会认为,如果加载程序还没有第一次启动,它将在停止声明中,为什么要重新启动?”。
停止状态表示加载程序以前处于启动状态。在停止状态下,加载程序可能具有以前加载的数据,它应该监视下划线数据源中的更改。从停止状态,加载程序可以回到启动状态或重置状态。如果重新启动,则如果在停止时数据源中没有任何更改,则可以使用以前加载的数据。
创建加载程序时,但在启动之前,它被认为处于重置状态。这很好,因为在这种状态下,还没有加载数据,而且加载程序也不应该执行上面提到的任何操作。
发布于 2017-05-23 03:15:52

我想这会对你有帮助。这张地图显示了android生命周期和加载程序生命周期。
https://stackoverflow.com/questions/27572812
复制相似问题