假设我们现在需要读取数据库中的联系人,如果联系人很多的话,我们必须将查询数据库的操作逻辑放在子线程中,不然会导致UI线程阻塞,然后再及时将查询到的数据告知显示界面让其刷新.
其次,如果联系人数据库中数据变化了,我们还需要通过观察者模式的ContentObserver类中的onChange方法来监听相应的数据库改变,然后再重新查询,排序,刷新等等(这里不对ContentObserver内容观察者做解释,有兴趣的朋友可以自己查资料)
上面思路也能实现我们想要的结果,但是使用加载器Loader和加载管理器LoaderManager能够更加方便实现.
这是在Android3.0中才引入了加载器/装载器(Loader)的功能,这使它很容易在Activity或Fragment中使用异步的方式加载数据。装载器Loader的特点如下:
1. 装载器对于每个Activity和Fagment都是有效的;
2. 装载器提供异步数据加载的能力;
3. 装载器监视数据资源并且当内容改变时发送新的结果;
4. 在配置改变后重建的时候,装载器自动的重连最后的装载器游标,因此,不需要重新查询数据。
LoaderManager就是加载器的管理器,一个LoaderManager可以管理一个或多个Loader,一个Activity或者Fragment只能有一个LoadManager。LoaderManager管理Loader的初始化,重启和销毁操作。
从官网就可以看出它包含的方法有:
对应的就是这几个操作。
initLoader是初始化一个加载器,它的第三个参数是一个LoaderCallbacks<D>接口,LoaderManager的initLoader是不做任何事情的,它只绑定了一个LoaderCallbacks<D>,具体的创建Loader的事情是由这个callback来做的。
LoaderCallbacks<D>接口需要实现的三个方法:
在loader创建loader的时候会调用onCreateLoader,然后当load数据结束的时候(第一次读取数据或者数据有改变的时候load数据)会调用onLoadFinished,而onLoaderReset只有在destory一个loader的时候才有可能调用。