ang*_*guy 8 android asynctaskloader
我试图了解AsyncTaskLoaders的一些细节.对于其他人来说,这可能是显而易见的,但我无法找到一个明确的示例或定义来演示和夸大当您覆盖该deliverResult()方法时会发生什么.实际交付的是什么?它如何与调用对象交互?我可以看到使用super.deliverResult,它从类中传递一个私有对象.那么,加载器是否自动知道与"交付结果"相关联的内容.我完全糊涂了.
cro*_*orc 25
好像我参加派对有点晚了,不管怎么说......
这个中间步骤的主要优点之一是后台加载和UI线程的回调onLoadFinished()被调用
loadInBackground()deliverResult() 和onLoadFinished()是它为我们提供了一种从课堂内快捷整个加载过程的方法AsyncTaskLoader.这可以很好地用于在AsyncTaskLoader中缓存加载结果,并防止在缓存数据时发生后台加载.
为什么我们要这样做呢?加载程序处理那些可怕的活动生命周期问题(例如,旋转设备),维护状态(如缓存数据)以及在基础数据更改时(CursorLoader)具有更新方法的整点是不是?
嗯,是的,但这不是整个故事.
考虑一下这个用例:
你的应用程序(带有AsynTaskLoader的应用程序)已经启动并且已经将数据加载到你的UI中.然后,您切换到您的Twitter应用程序以检查一些新闻并返回到您的应用程序.
没有缓存,返回到您的应用程序后,加载程序将重新加载.此行为与配置更改后的行为不同,例如旋转设备,在这种情况下不会发生重新加载.
那么,我们如何阻止加载器重新获取数据,以防我们将我们的应用程序发送到后台,然后再返回它?
AsyncTaskLoader.deliverResult()在调用超类的deliverResult()实现之前,首先覆盖以便将获取的数据保存在缓存中.onStartLoading() 检查是否有缓存的数据,如果是的话,让你的AsyncTaskLoader刚刚交付.否则,开始加载.这是一个实现此行为的示例应用程序的链接.它只是一个"玩具应用程序",也是Udacity当前版本的"开发Android应用程序"基础课程的一部分.以下是该课程中相应视频的链接,用于处理此问题.(该课程是免费的,但您仍需要注册Udacity).
简而言之,这个应用程序演示的是一个UI,用户可以在其中输入搜索查询以搜索GitHub的repos(通过GitHub API),在TextView中显示生成的搜索URL,以及在另一个TextView中从GitHub获取的原始JSON .
整个行动恰好发生在MainActivity.java这里,相关部分是在AsyncTaskLoader一个匿名内部类中实现的:
对于第1步,只需在 实现中引入一个成员变量,AsyncTaskLoader该变量用作数据缓存.
/* This String will contain the raw JSON
from the results of our Github search */
String mGithubJson;
Run Code Online (Sandbox Code Playgroud)对于步骤2,覆盖 deliverResult()以缓存加载结果.
当loadInBackground()完成后,它通过它的返回值deliverResult().无论如何它确实如此,但是现在我们已经覆盖了deliverResult(),我们可以直接将我们获取的数据存储到我们创建的缓存成员变量中,并且具有非常好的远见.最后,我们链接到deliverResult()的超类实现,使用super.deliverResult()该实现将结果传递给onLoadFinished()在UI线程上运行的回调方法.
@Override
public void deliverResult(String githubJson) {
mGithubJson = githubJson;
super.deliverResult(githubJson);
}
Run Code Online (Sandbox Code Playgroud)步骤3,检查在onStartLoading()是否我们已经得到了缓存数据.
如果我们还没有缓存数据,只需强制加载就可以开始调用forceLoad().但是如果我们确实有缓存数据,只需调用deliverResult(yourCachedDataGoesHere)并传入缓存数据作为参数.
if (mGithubJson != null) {
deliverResult(mGithubJson);
} else {
forceLoad();
}
Run Code Online (Sandbox Code Playgroud)
因此,如果您现在在应用程序和其他应用程序之间来回切换,您会注意到没有重新加载,因为加载程序将只使用您的缓存数据.
小智 5
假设在后台加载数据时,此时,用户按下HOME按钮并存在该应用程序,当用户返回到该应用程序时,加载已完成。因此我们已经有了数据,然后AsyncTaskLoader将调用该deliverResult()方法,将数据传递给该onLoadFinished()方法进行显示。
当用户回到app时,onStartLoading()被称为loadInBackground()。在这种方法中,我们可以检查数据是否为空,如果不为空,则调用deliverResult()并将结果发送到onLoaderFinished(),这样可以防止重新加载数据。
当我们按下HOME时,该应用程序会出现,然后返回,它将不会创建新的加载程序,而是旧的加载程序将尝试加载数据。
| 归档时间: |
|
| 查看次数: |
3366 次 |
| 最近记录: |