文档章节

Loader异步加载数据

新根
 新根
发布于 2015/07/31 16:56
字数 431
阅读 241
收藏 8

在android3.0开始,新增了Loader.  Loader加载数据的方式是异步的。
Loader的特点:
 1.适合于activity和fragment
 2.提供了异步加载数据机制
 3.监控数据源,当数据源发生改变时,会传递新结果
 4.自动重连到最后一个数据加载器游标,不需要重新查询数据


使用情况:对数据源监控,比如contentProvider.
     CursorLoader是AsyncTaskLoader的子类,AsyncTaskLoader会提供AsynTask去操作。故不会阻塞UI线程。


实例:获取手机号码
public class MainActivity extends ListActivity implements LoaderCallbacks<Cursor> {
    //ListActivity可以不写setContentView(R.layout.activity_main),因为其含有默认的布局。
 //ListActivity对应布局中的ListView的   android:id="@android :id/list"
 public static final int ID = 110;

 SimpleCursorAdapter adapter;
 String[] showContent = new String[] {
          Phone.NUMBER};

 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  adapter = new SimpleCursorAdapter(this,
    android.R.layout.simple_list_item_1, null, showContent,
    new int[] { android.R.id.text1});
  
  setListAdapter(adapter);

  
  //参数:id,Bundle对象(onCreateLoader()中第二个参数),LoaderCallbacks<D> 对象
  getLoaderManager().initLoader(ID, null, this);
 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {

  getMenuInflater().inflate(R.menu.main, menu);

  return true;
 }
     //创建Loader对象,CursorLoader对象(含有AsyncTask的功能)会自己在后台线程加载数据,最后返回一个cursor
    public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
  Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
    //若是出现java.lang.IllegalArgumentException: column '_id' does not exist,
      //则是String[] projection中没有写入 '_id'。
      //simplecursoradapter在显示时根据'_id'来显示。故不能没有'_id'
  CursorLoader loader = new CursorLoader(this, uri, null, null,
    null, null);
  return loader;
 }

 //Loader第一次读取完数据,或者数据源发生变化时会被调用
 public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
  //一个loadermanager可以管理多个loader,故对loader的id进行判断
  switch (loader.getId()) {
   case ID:
    // 将查询到数据加载到listview上
    adapter.swapCursor(cursor);
    break;
 
   default:
    break;
  }

 }

 @Override
 public void onLoaderReset(Loader<Cursor> arg0) {
  adapter.swapCursor(null);//移除引用
 }

}

© 著作权归作者所有

新根
粉丝 5
博文 28
码字总数 9431
作品 0
深圳
程序员
私信 提问
加载中

评论(1)

杰乐优
杰乐优
喜欢分享的人,谢谢
Android Loader 机制,让你的数据加载更加高效

前言 在 Android 中,任何耗时的操作都不能放在 UI 线程中,所以耗时的操作都需要使用异步加载来实现。其实,加载耗时数据的常用方式其实也挺多的,就让我们来看一下 1、Thread + Handler Th...

developerHaoz
2017/11/27
0
0
Android学习笔记系列六 —— Loaders加载器

Loaders 从Android 3.0开始引进了loader(加载器)技术, 在activity或者fragment中,loaders可以把异步地加载数据变得更简单。Loaders具有以下特性: 他们对于每一个和都是有效的。 他们可以提...

微笑的江豚
2016/03/18
40
0
any-loader JS数据加载器中间件

简介 any-loader 旨在为 node.js 和其他的 javascript 提供一个可定制程度较高的数据加载器中间件类库。本身并不实现任何数据加载器的实现逻辑,只界定了数据 流走向的标准接口 ,调用顺序(...

曾建凯
2018/11/13
129
0
Android知识点回顾之Loader

Loader是谷歌在Android 3.0引入的异步加载机制,能够对数据异步加载并显示到Activity或Fragment上,使用者不需要对数据的生命周期进行管理,而是交给Loader机制来管理。 使用Loader的优点 假...

星泉毅
2017/12/06
0
0
Android 装载器---概要

在Android3.0中引入了装载器的功能,这使它很容易在Activity或Fragment中使用异步的方式加载数据。装载器的特点如下: 1. 装载器对于每个Activity和Fagment都是有效的; 2. 装载器提供异步数...

长平狐
2012/10/16
49
0

没有更多内容

加载失败,请刷新页面

加载更多

如何在Javascript数组的开头添加新的数组元素?

问题: I have a need to add or prepend elements at the beginning of an array. 我需要在数组的开头添加或添加元素。 For example, if my array looks like below: 例如,如果我的数组如下...

技术盛宴
12分钟前
11
0
利用Python实现SQL自动化

笔者在工作中经常要使用SQL,其不乏存在恼人的细微差异和种种限制,但说到底,它是数据行业的基石。因此,对于每一位数据领域的工作者,SQL都是不可或缺的。精通SQL意义非凡。 SQL是很不错,...

Python圈子
15分钟前
10
0
UI库

ViewUI (推荐) amazeui layUI

四季变幻
21分钟前
21
0
如何实现RSA签名与验签

md5,sha1,sha256等签名方式相信大家已经都非常熟悉了,今天介绍如何使用RSA进行签名。 RSA签名使用起来其实也是非常的简单,无非就是使用私钥进行签名,使用公钥进行验签。使用方法如下。 ...

专业写BUG的程序员
23分钟前
17
0
我的Spring Cloud(十):Zipkin 服务跟踪

一、概述 为什么要有服务跟踪,分布式系统中有很多个服务在相互调用,调用关系是错综复杂的,如果这时出现了问题,我们在进行问题排查的时候,或者在优化架构的时候,工作量就比较大,这时候...

Zing丶
25分钟前
31
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部