loader 编写一个android_android 自定义 loader实现

android 的loader是android 3.0后的一种异步数据加载机制。

使用起来也颇为方便。

以下这块摘抄自工匠若水的博客

在Android中任何耗时的操作都不能放在UI主线程中,所以耗时的操作都需要使用异步实现。同样的,在ContentProvider中也可能存在耗时操作,这时也该使用异步操作,而3.0之后最推荐的异步操作就是Loader。它可以方便我们在Activity和Fragment中异步加载数据,而不是用线程或AsyncTask,他的优点如下:

1.提供异步加载数据机制;

2.对数据源变化进行监听,实时更新数据;

3.在Activity配置发生变化(如横竖屏切换)时不用重复加载数据;

4.适用于任何Activity和Fragment;

这位同学基本介绍了很多东西,以及源码分析,我就不重复造轮子了,我就主要写一下,自定义loader的实现:

首先我建立一个数据源类(数据源可以是本地数据库,可以是网络获取,可以是任何)

TestData:

public class TestData {

private List peopleList = new ArrayList<>();

interface Change{

void onChange();

}

public void save (People people,Change change){

peopleList.add(people);

if(change!=null){

change.onChange();

}

}

public List getPeopleList (){

return peopleList;

}

}

为了清晰的理解loader的自定义用法,我对代码进行了极大的精简:

这个数据源简单的不能再简单了:

我建立了一个接口:

interface Change{

void onChange();

}

这个主要是为了loader可以调用,对数据进行更新。

save主要是对数据进行更新。

有了数据源,我们就可以建立自定义loader了:

MyTestLoader:

public class MyTestLoader extends AsyncTaskLoader> implements TestData.Change {

public MyTestLoader(Context context) {

super(context);

}

TestData testData ;

public MyTestLoader(Context context,TestData testData) {

super(context);

this.testData = testData;

}

@Override

public List loadInBackground() {

List data = testData.getPeopleList();

List data2 = new ArrayList<>();

data2.addAll(data);

return data2;

}

@Override

protected void onReset() {

onStopLoading();

}

@Override

protected void onStartLoading() {

super.onStartLoading();

deliverResult(testData.getPeopleList());

if (takeContentChanged()) {

forceLoad();

}

}

@Override

protected void onStopLoading() {

super.onStopLoading();

cancelLoad();

}

@Override

public void deliverResult(List data) {

if (isReset()) {

return;

}

if (isStarted()) {

super.deliverResult(data);

}

}

@Override

public void onChange() {

if (isStarted()) {

forceLoad();

}

}

}

首先构造函数中添加数据源的引用。其次重写如下方法

loadInBackground:主要是进行异步加载数据的,在其中,我将数据源的数据return出来了。

以下为一对。

onStartLoading:生命周期,在创建时成立。

onStopLoading:生命周期,在结束时调用。

onChange:就是数据源里的接口,当调用时候,进行forceLoad

deliverResult:则是真正的返回数据。

自定义的loader基本就是这样了,我们进行对这个自定义loader运用。

建立一个activity,实现如下接口LoaderManager.LoaderCallbacks>

public class MActivity extends BaseActivity implements LoaderManager.LoaderCallbacks>

修改如下方法:

testData = new TestData();

testLoader = new MyTestLoader(this,testData);

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

@Override

public Loader> onCreateLoader(int id, Bundle args) {

return testLoader;

}

@Override

public void onLoadFinished(Loader> loader, List data) {

if (data != null) {

Logger.i("数据为"+data.toString());

} else {

Logger.i("数据为null");

}

}

@Override

public void onLoaderReset(Loader> loader) {

}

再建立一个点击事件,进行调用

fab.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

People p = new People();

p.setName("wanger");

testData.save(p,testLoader);

}

});

接下来就是见证奇迹的时刻了,

日志里便打印出了详细的数据:

log如下:

数据为[People{name='wanger'}, People{name='wanger'}, People{name='wanger'}, People{name='wanger'}, People{name='wanger'}, People{name='wanger'}]

如上便是自定义loader的实现:谢谢观看,小弟才疏学浅,如有错误,帮我指出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值