Loader异步加载数据

在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);//移除引用
 }

}

时间: 2024-10-06 00:41:19

Loader异步加载数据的相关文章

[Android Pro] 使用CursorLoader异步加载数据 from 3.0

Android 3.0引入了CursorLoader实现异步加载数据,为了避免同步查询数据库时阻塞UI线程的问题.在API 11之前可以通过下载支持库,来使之前的系统支持此功能,下载页面为 http://developer.android.com/tools/extras/support-library.html. 下面是一个例子: public class ListViewLoader extends ListActivity implements LoaderManager.LoaderCa

iScroll.js 向上滑动异步加载数据回弹问题

iScroll是一款用于移动设备web开发的一款插件.像缩放.下拉刷新.滑动切换等移动应用上常见的一些效果都可以轻松实现. 现在最新版本是5.X,官网这里:http://iscrolljs.com/ 下面是按照官网给的Demo,写的一个异步加载数据实例: 1 <title>iScroll demo: click</title> 2 <script src="~/Scripts/iscroll5/jquery-1.10.2.js"></scrip

SpringMVC+Jquery -页面异步加载数据

背景: 做项目时涉及到页面,当我打算在controller中传一个list到页面,然后通过<c:foreach>循环遍历出来时,同事说:你这样每次都要刷新,这都是几百年前使用的技术了.你用post实现异步加载数据.然后就...... ResultUtil.java 工具类: package com.sgcc.uds.fs.config.web.util; import java.util.HashMap; import java.util.Map; import net.sf.json.JSO

jQuery异步加载数据添加事件

几个月前在一个项目中涉及到树形栏,然后看了很多插件,觉得有点麻烦,于是自己写了一个,写着写着就出问题了.当时项目是通过树形栏进行权限控制的,管理员可以对从数据库去的数据动态生成树形栏进行增删改查操作,可是用$(".XX").click();方法是不行的.1.之前用的是jq1.4.3 ,jq1.7一下都可以使用live()方法,来实现该功能 $('#div').live('click',function(){ //do stuff }); 但是live方法也有不支持的事件,例如:togg

Android利用Volley异步加载数据完整详细示例(二)

MainActivity如下: package cc.y; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.os.Bundle; import android.util.LruCache; import android.widget.ImageView;

Android利用Volley异步加载数据完整详细示例(一)

MainActivity如下: package cc.cn; import java.util.HashMap; import org.json.JSONObject; import android.app.Activity; import android.content.Context; import android.os.Bundle; import com.android.volley.AuthFailureError; import com.android.volley.RequestQ

淘宝购物车页面 智能搜索框Ajax异步加载数据

如果有朋友对本篇文章的一些知识点不了解的话,可以先阅读此篇文章.在这篇文章中,我大概介绍了一下构建淘宝购物车页面需要的基础知识. 这篇文章主要探讨的是智能搜索框Ajax异步加载数据.jQuery的社区非常的活跃,许多朋友都在不同地方分享了很多优秀的插件.我在相关的网站上找过想实现类似功能的插件,但是没有找到.于是乎,自己动手丰衣足食.自己来搭建智能搜索框下拉列表.当然,如果有类似功能并且常维护Bug的插件,望留言交流. 源码地址: 淘宝购物车页面--PC端和移动端项目实战 首先需要先给大家打一根

Android-搭建简单服务端+ListView异步加载数据

Android-搭建简单服务端+ListView异步加载数据 2014年5月6日 本篇博文带给大家的是教大家如何在MyEclipse中搭建一个服务端,并通过手机端与其通信,异步加载数据. 笔者使用的是MyEclipse,各位也可以直接用Eclipse创建Java Web项目,谷歌提供的ADT Bundle是不能创建Web项目,读者可以下载Eclipse For JaveEE Developer这个IDE. 下面来介绍如何在MyEclipse创建一个Web项目,并部署到Tomcat当中,关于Tom

iOS中异步加载数据效率更高

在开发中有得时候虽然也能从服务器返回来数据,但是我们要根据实际情况,加快数据的显示,所以我们使用异步加载数据. 下面我们看一下如何异步加载数据 dispatch_async(dispatch_get_global_queue(0, 0), ^{ //下载数据(这里写的是使用AFNetWorking请求的数据) dispatch_async(dispatch_get_main_queue(), ^{ //更新视图(这里写的是,要把数据显示出来) }); });