Loader使用详解

  Loader是安卓在3.0的时候引入的,可以轻松的Activity和Fragment中异步加载数据。它可以在每个Activity和Fragment中使用,同时支持异步加载数据,它可以监控数据源,并在其发生改变的时候传递新的数据,并且,在某一配置发生改变重建Loader的时候,会自动重新连接到上一个Loader的游标,所以,它可以实现不重新查询其数据!

  在使用Loader的时候可能会用到一些类和接口,虽然不是都要用到,但是为了初始化一个Loader以及实现一个Loader类,始终需要使用LoaderManager!下面就让我们来详细的谈谈!

  LoaderManager是一种用来与Activity和Fragment关联的抽象类,它可以管理一个或者多个Loader的实例。这可帮助应用管理与Activity或者Fragment生命周期相关联、运行时间较长的操作。不过它最常见的用法是与CursorLoader一起使用,但是你还可以自己扩展Loader类,用来加载其它的数据,这个要看你自己的需求了!虽然在每一个Activity和Fragment中只能有一个LaderManager,但是一个LoaderManager可以管理多个Loader!

  LoaderManager.Callbacks是一种回调接口,用与和LoaderManager进行交互。它有三个主要方法:onCreateLoader(),onLoadFinished(),onLoaderReset()。你基本上都要实现这三个方法!

  Loader是一种执行异步数据加载的抽象类,这是Loader的基类。你可以使用CursorLoader,但是可以自己实现它的子类,从而加载不同的数据,在这个Loader是启动中的时候,你应该监控数据源发生的变化,发生了变化要及时的传递新结果!

  AsyncTaskLoader是一种使用AsyncTask执行工作的抽象Loader。一般情况下,你扩展Loader,扩展这个类就足以满足大部分的要求了。下面要说的CursorLoader也是继承自这个类的!

  CursorLoader是AsyncTaskLoader的子类,一般是与ContentResolver 配合使用的!

 
  现在再让我们来谈谈如何在应用中使用Loader。不用说,你肯定需要一个Activity或者Fragment,因为你数据加载完毕,总要显示吧!所以必须要有LoaderManager,这个上面也已经提到了!对于一个Loader类,你可以使用CursorLoader,当然自己扩展也是可以的!一个LoaderManager.Callbacks接口的实现,上面说了,这是一种回调接口,用来与LoaderManager进行交互,而且它的三个方法也很重要!所以你也要实现它。一种显示数据的方法,这要看你是加载的什么数据了,按照你加载的数据来选择.还有就是使用Loader时数据源,这个也是按你自己的实际情况来定的,比如你是使用CursorLoader,那么你就需要一个ContentResolver了!

  这些准备好了之后,就要启动Loader了,想要启动Loader,就需要一个LoaderManager,所以这也是为什么一定需要一个LoaderManager的原因了!通常情况下,你需要在Activity和Fragment创建的时候启动Loader,启动它很简单,只需要一行语句:

    getLoaderManager().initLoader(0,null,this);


  这个initLoader方法有三个参数,我来详细的说明一下。首先,第一个是标识Loader的标识ID,在这里我使用0,你可以其它的数字,也都是可以的。这个标识ID可以在Loader创建的时候,用来判断指定ID的Loader是否已经存在,如果存在,那就直接连接上已经存在的Loader,不再重新创建一个了。反之,将会触发LaderManager.LoaderCallbacks.onCreateLoader方法,在此方法中,可以进行一些处理,比如实例化一个Loader,因为这个是创建一个Loader,所以你还需要返回一个已经实例化好了的Loader。第二个参数是在构建时提供给Loader的可选参数,一般为null。最后一个是LoaderManager.Callbacks接口的实现,LaoderManager将调用此实现来报告Loader的事件,也就是调用那三个方法。

  说到那三个方法,就需要仔细的说一下LoaderCallbacks回调接口,它的实现是与Loader相关联的,当Loader的状态发生变化的时候,它就会被调用,它的那三个重要的方法:

       onCreateLoader()针对指定的ID进行实例化并返回新的Loader;

       onLoaderFhed()将在先前创建的加载器完成加载时调用,也就是说,当数据加载完毕,Loader会调用这个方法将数据传递进来! 所以说你要在这里进行数据处理的操作。

       onLoaderReset()这个方法将在先前创建的加载器重置并且其数据因此不能用时调用


下面我给出一个简单的示例

@Override
public Loader<List<Task>> onCreateLoader(int id, Bundle args) {
    mStatisticsView.setProgressIndicator(true);

  //这个mTasksLoader是我自己扩展的一个Loader类的实例,用来加载List<Task>类型的数据,
  //你可以自己扩展一个!或者使用CursorLoader!
 return mTasksLoader;
}

@Override
public void onLoadFinished(Loader<List<Task>> loader, List<Task> data) {

  //这是一个方法,我将传进来的数据传递进去,进行一些处理!
 loadStatistics(data);
}

@Override
public void onLoaderReset(Loader<List<Task>> loader) {
//这个方法是重置的时候使用,我这里用不到!
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值