异步任务加载器重置状态。

3
这可能看起来是一个愚蠢的问题,但我无法理解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线程时,将调用此方法。我的问题是:为什么我们要询问Loader是否已重置?重置它的含义是什么?该类声明如下:

/**
 * 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状态,为什么要重新启动?

我想我真的不太了解加载器如何响应Activity生命周期,但文档中没有提到任何内容。

2个回答

5

我认为这将对你有所帮助

我认为这张地图可以帮助你理解Android生命周期和加载器生命周期。


非常好,你从哪里得到这个图表的? - Felipe Cerda

2

然而,我仍然不明白当Asynctask处于重置状态时的情况。

我相信你的意思是“...当LOADER处于重置状态时”。

通常,人们会使用LoaderManager来管理加载器的生命周期。

当用户调用LoaderManager#destroyLoader()时,LoadManager将从其缓存中删除此加载器。 还可以在调用LoaderManager#restartLoader()或Activity/Fragment经历其销毁阶段时销毁加载程序。 如果此类加载器先前向其客户端(通常为Fragment或Activity)提供了数据,则LoaderManager将调用onLoaderReset()并指示加载器进行重置。 这为客户端提供了一个机会,以删除对数据的任何引用,并使加载器释放与数据相关联的任何资源。 请记住,数据的所有者是加载器而不是客户端。

我的问题是:为什么我们要问加载器是否已重置?

deliverResult在UI线程的上下文中被调用,但是由实际加载操作的后台线程触发。 在后台线程完成之前,加载器状态可能会被更改为reset()。 执行isReset()检查是为了避免在加载器处于重置状态的竞争条件情况下通知客户端有新数据的情况。

它被重置到什么意思?

处于重置状态的加载器应停止所有操作,因为它可能很快就会被销毁。 特别是,它应释放任何占用以前加载数据的资源,停止加载新数据并监视底层数据源中的更改。

你会认为,如果加载器尚未首次启动,它将处于STOPPED状态,为什么要重新启动?

已停止状态表示加载器先前处于启动状态。 在停止状态下,加载器可能具有先前加载的数据,并且应该监视底层数据源的更改。 从已停止状态,加载器可以返回到已启动状态或重置状态。 如果重新启动,则可以使用其先前加载的数据(如果在停止时没有更改数据源)。

当加载器创建但在启动之前,它被认为处于重置状态。 这很好地工作,因为在此状态下尚未加载数据,并且加载器不应执行任何操作,如上所述。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接