您的位置:首页 > 移动开发 > Android开发

Android 之异步加载LoaderManager

2015-11-14 17:27 417 查看
LoaderManager:

Loader出现的背景:

Activity是我们的前端页面展现,数据库是我们的数据持久化地址,那么正常的逻辑就是在展示页面的渲染页面的阶段进行数据库查询。拿到数据以后才展示页面。但是这个逻辑有一些缺点:

首先是查询数据的逻辑放在了UI生成的同个线程中,这个就意味着在查询数据的时候,UI页面生成的工作被阻塞住了。UI一旦被阻塞用户就会被感知出来了,因此就会出现各种无相应页面(Application Not Response),或者activity页面延迟的现象,这对用户体验来说是不可接受的。

其次是在渲染页面的时候需要固定需要进行一次数据查询,但是这个是很不节省资源的。假如一个Activity从一个停止状态回到前台,那么这个时候尽管数据并没有变化,但是也需要进行一次query操作。在浪费资源的同时也再次增加了页面渲染失败的风险。

还有就是当数据变化的时候如何通知页面进行修改呢?这个时候往往就又要创建一个monitor的角色,来当数据源变化的时候来让页面重新调用requery。

因此在Android的越来越提倡用户体验的今天,加载器和加载管理器(Loader,LoaderManager)就出现了。

在Android3.0中,Google引入了一种数据异步加载机制,该机制的核心,便是LoaderManager、Loader,顾名思义,LoaderManager是Loader的管理者,而Loader便是数据加载器,你可以根据自己的需要实现形形色色的数据加载器。

Google强烈建议在加载数据时,使用LoaderManager及其相关的机制。

每个Activity和Fragment中,都会有且只有一个LoaderManager,而LoaderManager中可以有多个Loader,也就是说,在一个Activity或者Fragment中,你可以同时异步加载N则不同的数据,具体加多少则,要看你那一亩三分地(Activity和Fragment就是你的地)有多大产。

Loaders机制在Android 3.0版本后引入。Loaders机制使一个Activity或者一个Fragment更加容易异步加载数据。Loaders有如下的特性:

Ø 它们适用于任何Activity和Fragment;

Ø 它们提供了异步加载数据的机制;

Ø 它们检测数据源,当数据源内容改变时它们能够传递新的结果;

Ø 当配置改变后需要重新创建时,它们会重新连接到最后一个loader的游标。这样,它们不需要重新查询它们的数据。

api

Class/Interface

描述
LoaderManager一个与Activity和Fragment有关联的抽象类,用于管理一个或多个Loader实例。这有助于app管理长运行操作。

使用它的最显著的例子是CursorLoader。每个Activity或Fragment只能有一个LoaderManager。

而一个LoaderManager可以有多个loaders。

LoaderManager.LoaderCallbacks提供给客户端的一个callback接口,用于和LoaderManager进行交互。

例如,你可以使用onCreateLoader() callback来创建一个新的loader。

AsyncTaskLoader一个抽象Loader,提供一个AsyncTask进行工作。
CursorLoaderAsyncTaskLoader的子类,用于向ContentResover请求,返回一个Cursor。

这个类以标准的游标查询方式实现了Loader协议,建立了AsyncTaskLoader,使用一个后台线程来进行游标查询,不会阻塞app的UI。

因此,使用这个loader是从ContentProvider加载异步数据的最好的方式。

如何在Activity中使用Loader?

1.声明一个LoaderManager的实例。并在oncreate方法中实例化

2. 在oncreate方法中启动一个loader

(initLoader(0,null, this);参数分别表示:

Ø 一个标志loader的唯一ID。

Ø 提供给loader构造函数的参数,可选。

Ø 一个LoaderManager.LoaderCallbacks的实现。该回调参数不能为空)

3.实现回调:一个LoaderManager.LoaderCallbacks的实现。在这你创建新的loader,和管理已经存在的loaders。

onCreateLoader方法中完成一个CursorLoader的创建,需要从一个ContentProvider里加载数据。

@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
int flag = URI_MATCHER.match(uri);
switch (flag) {
case STUDENT:
return "vnd.android.cursor.item/student";
case STUDENTS:
return "vnd.android.cursor.dir/studens";
}
return null;
}


View Code
.在清单文件中注册内容提供者: <provider android:name=".StudentContentProvider" android:authorities="com.example.android_07loader_manager.StudentContentProvider"></provider>

2.2 完成增删改查

2.3建测试类

第三步:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: