天天看点

[Android Pro] Android异步任务处理之AsyncTaskLoader的使用

最近项目中涉及到加载本地的地名.db文件,数据量大,自然不能直接放在UI线程中操作,好在Google在Android3.0以后,提供了AsyncTaskLoader来做一些耗时的异步任务。

1、They are available to every Activity and Fragment. 

//支持Activity和Fragment 

2、They provide asynchronous loading of data. 

//异步下载 (就是不影响UI线程) 

3、They monitor the source of their data and deliver new results when the content changes. 

//当数据源改变时能及时通知客户端 

4、They automatically reconnect to the last loader’s cursor when being recreated after a configuration change. Thus, they don’t need to re-query their data. 

//发生configuration change时自动重连接

下面引用官方的一个展示当前设备所有已安装应用程序的DEMO,来对AsyncTaskLoader的用法做一个详细的介绍: 

项目结构如图:

[Android Pro] Android异步任务处理之AsyncTaskLoader的使用

第一步:我们需要写一个对应于每一个应用程序的实体类,该实体类包含应用程序图标和标签两个属性。 

AppEntry.java:

[Android Pro] Android异步任务处理之AsyncTaskLoader的使用
[Android Pro] Android异步任务处理之AsyncTaskLoader的使用

第二步:需要写一个自己的AppListLoader ,继承自AsyncTaskLoader,并实现其相关抽象方法。

(1)onStartLoading:注册一些监听器到loader上,并且执行一次forceLoad(); 否则loader不会开始工作 

(2)loadInBackground:不用说,在这里就是加载数据并且返回,其实这个数据就返回到了LoaderManager的onLoadFinished方法第二个参数 

(3)onStopLoading:停止加载数据,但不要停止监听也不要释放数据,就可以随时重启loader 

(4)onReset:先确保已经停止加载数据了,然后释放掉监听器并设为null 

(5)onCanceled: 在这里可以释放资源,如果是list就不需要做什么了,但是象cursor或者打开了什么文件就应该关闭一下;

AppListLoader .java:

[Android Pro] Android异步任务处理之AsyncTaskLoader的使用
[Android Pro] Android异步任务处理之AsyncTaskLoader的使用

第三步:在MainActivity中调用AsyncTaskLoader,并继承LoaderManager.LoaderCallbacks的接口,重写接口方法:

(1)onCreateLoader: 这个是创建一个AsyncTaskLoader并返回,我们在里面new一个自己写的AppListLoader并返回就OK了; 

(2)onLoadFinished: 这个是加载完成后可以更新UI,在这里就是setAdapter了 而这个加载过程其实就是在CursorLoader里面完成的, 

只不过系统帮我们完成了,而如果自定义loader的话就要自己完成,这就是区别; 

(3)onLoaderReset: loader的重置,在这里一般让UI不显示数据就行;

MainActivity .java:

[Android Pro] Android异步任务处理之AsyncTaskLoader的使用
[Android Pro] Android异步任务处理之AsyncTaskLoader的使用

然后运行程序如下:

[Android Pro] Android异步任务处理之AsyncTaskLoader的使用

打开应用,AppListLoader中核心方法执行的先后顺序:

[Android Pro] Android异步任务处理之AsyncTaskLoader的使用
[Android Pro] Android异步任务处理之AsyncTaskLoader的使用

返回键,会执行的方法及执行顺序:

本项目的学习之后,我们应该掌握以下几点: 

(1)理解AsyncTaskLoader的每一个核心方法的作用及调用时机,以及如何自定义一个AsyncTaskLoader。 

(2)如何在Fragement中启动AsyncTaskLoader,继承LoaderManager.LoaderCallbacks,实现接口的三个方法。 

(3)应该了解AsyncTaskLoader的底层实际上是执行的AsyncTask,这个可以看看源码。 

(4)如何应用ApplicationInfo,获取相关的程序信息。

本文转自demoblog博客园博客,原文链接http://www.cnblogs.com/0616--ataozhijia/p/6204357.html如需转载请自行联系原作者

demoblog

继续阅读