一, 数据访问的常用模式
大家都知道在android里访问数据,以及一些耗时的操作是不能放在主线程去做的,所以我们都知道使用异步的。有关异步加载数据常用的有以下几种
备注: 以上我是总结出来目前市场上常用的异步加载处理模式。
二, Android Loader的优点
Android Loader简介:
Android的装载器(loader)是从Android 3.0新引入的API , 主要完成单线程耗时数据异步装载功能,并在数据有更新自动通知UI刷新的作用。业内也叫加载器,装载机,Loader一般用在Activity和fragment异步加载数据,无需重新启动一个线程来执行数据加载,异步加载可以用asyncTask 但是loader自带数据结果监听机制,可以进行UI更新。
官方介绍:
A class that performs asynchronous loading of data. While Loaders are active they should monitor the source of their data and deliver new results when the contents change. SeeLoaderManagerfor more detail.
Android Loader 优点:
适用于任何Activity和Fragment;
提供了异步加载数据的机制;
检测数据源,当数据源内容改变时它们能够传递新的结果;
当配置改变后需要重新创建时,它们会重新连接到最后一个loader的游标。这样,它们不需要重新查询它们的数据。
在Activity配置发生变化(如横竖屏切换)>时不用重复加载数据
三, Android Loader架构
Loader
只是一个实例,一个执行体。他依赖于loaderManager的管理。LoaderManager担起对loader的管理,肩负起fragement
和activity之间如何在loader之间贯穿起来。有人说LoaderManager是一个抽象类,里面定义了各种方法。而官方文档则称
LoaderMagaer是一个接口。其实不去在意这些定义。我们明显可以感觉到。Loader的创建,使用,销毁肯定都是LoaderManager去
定义的。一个LoaderManager可以管理多个loader。另外,loader的实现不会自己去实现而是委托自己的子类去实现。
AsyncTaskLoader 和 CursorLoader
四,AsyncTaskLoader 详解
AsyncTaskLoader是loader的一个子类。是一个抽象类。提供了AsyncTask。
Publick的方法如下图:
更多:https://developer.android.com/reference/android/content/AsyncTaskLoader.html
五,AsyncTaskLoader Demo
以获取当前手机安装成功的app为例,讲关键代码:
新建一个loader继承AsyncTaskLoader:
把loader传给app的实体类通过构造函数把loader拿到然后获取app的icon:
在自己创建的appadapter里面设置需要的icon和label
说明:demo是基于官方写的,完美体现了AsyncTaskLoader的加载和及时刷新的效果。可以卸载一个程序,demo会立马自己刷新数据展现。
AppListFragment会实现loader的callback接口实现onLoaderReset方法刷新页面数据。有需要的可以私我要完整demo
Demo效果:
六,CursorLoader 详解
CursorLoader又是AysncTaskLoader的一个子类。查询ContentResolve并且返回一个Cursor。可以说CursorLoader
是一个很牛的查询工具。以一种标准的方式实现了loader的接口。
相对于AysncTaskLoader的实例demo简单些,只是对手机通讯录做个查询展现:
查询耗时的操作直接放到onLoadInBackground方法里做但是这里只是返回了一个cursor。处理要onLoadFinish里做:
说明:同样如果有删除,更新操作会在onLoaderReset里面实现。具体demo可以私下找我要
网上有很多关于loader的资料,本人只建议去看官网,官网更全面:
https://developer.android.com/reference/android/content/Loader.html