Loader异步装载

Loader异步装载
Loader使在Activity或Fragment中异步加载数据变得简单。
Loader装载器具有如下特性:
1.它们对每个Activity和Fragment都有效
2.他们提供了异步加载数据的能力
3.它们监视数据源的一举一动并在内容改变时传送新的结构
4.当由于配置改变而被重新创建后,它们自动重连到一个加载器的游标。

Loader的数据源可以是磁盘、数据库、ContentProvider、网络或者另外进程
Loader可以在不阻塞主线程的情况下获取并发送结果数据给接受者,也就是异步

Loader有三种内置类型
Loader、AsyncTaskLoader、CursorLoader
Loader是基类,本身仅仅定义了供LoaderManager与其他Loader通讯时使用的API。
AsyncTaskLoader是一个抽象的Loader。
几乎创建的有用的Loader类都是AsyncTaskLoader的子类。
CursorLoader是AsyncTaskLoader的一个子类
CursorLoader借助ContentResolver从ContentProvider加载Cursor

Loader API概述
LoaderManager   每个Activity或Fragment只能有一个LoaderManager
但是一个LoaderManager可以有多个Loaders。

LoaderManager.LoaderCallbacks   客户端和LoaderManager交互的回调接口。


Loader 执行异步加载数据的抽象类。是loader的父类。当loaders处于活动状态时,

它应该监控其数据的来源,当内容改变时候显示新的结果。
AsyncTaskLoader 抽象的loader提供一个AsyncTask来处理工作。
CursorLoader是AsyncTaskLoader的子类,查询ContentResolver返回一个游标。这个

类实现了Loader协议,对于游标查询在一个标准的方式,建立在AsyncTaskLoader基

础上,来执行由表查询在后台线程中,以至于不会中断应用程序的UI。从

ContentProvider中实现异步数据加载,而不是通过Fragment或者Activity来执行的

管理查询,是最好的方式。

使用Loader的方式
1.启动一个Loader,获得一个LoaderManager
LoaderManager manager = getLoaderManager(0;
初始化Loader对象
Loader loader = manager.initLoader(id,args,callback);
三个参数
id 一个唯一的id标识,用于表示这个Loader
args 构造函数的可选参数,可以为空
LoaderManager.LoaderCallbacks 的实现   调用LoaderManager的调用者
例子:
            manager=getLoaderManager();
            manager.initLoader(1, null, this);
manager.initLoader(id,args,callback)的调用确保了Loader被初始化
并且确保了Loader的存在。
这句话可能有两种结果
第一种,id标识的Loader已经存在,上次被创建的Loader会被重用。
第二种,如果不存在,由Id标识的Loader,initLoader()方法触发

LoaderManager.LoaderCallbacks 的onCreateLodaer()方法。

继承LoaderCallbacks回调接口,会重写三个方法



Loader子类之AsyncTaskLoader
1.Activity或者Fragment要实现LoaderManager.LoaderCallbacks接口
2.创建LoaderManager对象,通过getLoaderManager或getSupportLoader方法来实现
     如果继承于FragmentActivity类,则使用getSupportManager来创建

LoaderManager对象,否则使用前者创建即可。
3.初始化LoaderManager对象,调用initLoader方法来初始化
4.自定义Loader要继承于AsyncTaskLoader:
     必须要有构造方法。
     必须重写onStartLoading、LoadInBackground、deliverResult,
     而且要在onStartLoading中必须调用forceLoad()才能一次调用下一个方法。
     在loadInBackground方法中执行耗时操作。
     在deliverResult方法中执行适配器交换数据的操作。


Loader子类之CursorLoader
CursorLoader是AsyncTaskLoader的子类。
使用方法基本与AsyncTaskLoader相同。
但要注意:
在创建CursorAdapter的时候,指明注册一个内容观察者,可以在Cursor的内容发送

变化时实现自动更新。
adapter = new SimpleCursorAdapter(this,R.layout.listview,
               new String[]{},new int[]{},
               SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER)
当数据加载完毕的时候,在onloadFinished方法中adapter.swapCursor(data)
当以前的Cursor不用的时候,不要手动关闭Cursor,
可以在onLoaderReset()中调用adapter.swapCursor(null)来放弃。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值