阅读时有所疑惑的地方:
- onLoadFinished到底啥时候调用?sdk上说是上一次的loader初始化完以后。
- loader初始化以后,那几个回调函数调用顺序是什么?是每次都调用吗?每个回调函数都有其独特作用吧,需要在里面做对应的什么操作呢?
Loader是从API 11开始才有的,也即3.0以上的版本才支持。出现的目的是为了能够更好的异步加载数据,也能更通用。那么他的好处有如下几点:
- activity和fragment都可以用,通用性好;
- 异步加载数据;
- 能够监控源数据,当源数据发生变化的时候也做相应的变化;(这个自己试验过,调试API demos下的loaderCursor时,预先查询一个联系人,然后按主菜单键,把该联系人删掉,然后再打开loaderCursor,可看到相关的内容已经自动的发生改变,而onLoadFinshed等回调函数的等初始化查询的操作并没有执行)
- 在配置发生改变,如横竖屏切换的时候,能够自动重新连接上次查询结果,而不需要重复再次查询。
那么如何使用Loader来加载数据呢?使用Loader需要以下几个基本条件:
- 有一个LoaderManager。每个activity或者fragment都有且只有一个LoaderManager,用来管理该activity或者fragment下的Loader实例;
- 有一个Loader。实际加载数据的对象,常用的为CursorLoader,它继承自AsyncTaskLoader,可以异步加载数据;
- 实现了LoaderManager.LoaderCallBacks接口,里面包括几个常用的回调函数,用来和activity或者fragment交互;
- 展示loader加载出来的数据;
- 数据源,例如ContentProvider或者Sqlite文件。
一、初始化Loader
Loader直接通过LoaderManager的init(id,args,LoaderCallBacksImpl)方法来实现,其中,id为loader的标识,它在调用init方法时,判断当前给定的id是否已经存在。若已存在,则使用之前的loader对象来加载数据;若未存在,则会触发回调函数:onCreateLoader,使得activity或者fragment创建一个Loader实例对象并返回。有个疑问,在init时,若id存在,则还会触发onLoadFinished方法吗?
二、重新启动Loader
LoaderManager的restartLoader方法,该方法执行完成以后,会触发onLoadFinished方法,通知client端获取查询的数据。也就说onLoadFinished方法是在loader加载完数据以后触发。
三、LoaderManager的回调函数
主要使用的回调函数包括以下三个:
- onCreateLoader。 init方法调用以后根据id判断,是否需要加载该方法;
- onLoadFinished。loader加载完数据以后触发;
- onLoadRest。loader数据重置以后触发,客户端可以做相应数据清空操作。
Loader由activity自己来管理,感觉使用起来比自己写一套要方便一些。
更深一步的例子:LoaderThrottle,能够减少loader的查询次数,等研究完contentProvider后再来研究~~
看不清未来,那就看脚下。