文档章节

使用Loader进行异步IO操作

daveztong
 daveztong
发布于 2014/11/06 21:25
字数 499
阅读 19
收藏 0
异步加载数据又一利器:Loader。 Loader是API11中加入,通过使用Loader加载数据有以下好处: • The heavy lifting is automatically performed on a background thread, and the results are safely introduced to the main thread on completion. • Loaded data can be cached and redelivered on repeat calls for speed and efficiency. • The framework gives us control over when a Loaderinstance is destroyed, and allows Loaders to live outside the Activitylifecycle, making their data available across the application and across Activityrestarts. • Loaders monitor their underlying datasource, and reload their data in the background when necessary. The framework includes lifecycle callbacks that allow us to properly dispose of any expensive resources held by our Loaders. 在需要加载数据的地方实现LoaderCallbacks接口,实现下面三个方法:
CursorLoader onCreateLoader(int id, Bundle bundle);// 创建Loader
void onLoadFinished(Loader<Cursor> loader, Cursor media);// 接收后台返回的数据
void onLoaderReset(Loader<Cursor> loader);// clean up等操作
常用的Loader有AsyncTaskLoader(通用的) or CursorLoader(数据库专用)。
  • Building responsive apps with AsyncTaskLoader

通过AsyncTaskLoader来做耗时操作,如从MediaStore中获取一张缩略图: 1.首先继承AsyncTaskLoader<T>
// AsyncTaskLoader<T> 需要指明加载的数据类型,如Bitmap
public class ThumbnailLoader extends AsyncTaskLoader<Bitmap> {
// ...
}
2.覆盖必要的方法:
@Override
public Bitmap loadInBackground() {
  ContentResolver res = getContext().getContentResolver();
  if (mediaId != null) {
    return MediaStore.Images.Thumbnails.getThumbnail(res, mediaId,
      MediaStore.Images.Thumbnails.MINI_KIND, null);
  }
  return null;
}
其实这样就实现了一个Loader,但还能做得更好,就是对加载过的数据进行缓存,继续向下。 3.覆盖提交结果的方法:
@Override
public void deliverResult(Bitmap data) {
  this.data = data;
  super.deliverResult(data);
}
4.仅仅这样还不行,我们还要在加载的时候对其进行判断:
@Override
protected void onStartLoading() {
  if (data != null) {
    deliverResult(data);
  } else {
    forceLoad();
  }
}
首先判断是否有缓存,有就直接deliver,没有就forceLoad,如果覆盖了这个方法而又没有缓存,且也没有调用forceLoad,那么Loader永远不会加载任何数据。到这步,以近乎完美,但还是有一点收尾工作需要做,那就是当Loader被废弃的时候,需要做一些clean up的操作。 5.在Reset中清理资源:
@Override
protected void onReset() {
  if (data != null)
    data.recycle();
}
 
  • Building responsive apps with CursorLoader

     

© 著作权归作者所有

daveztong
粉丝 4
博文 93
码字总数 21482
作品 0
成都
程序员
私信 提问
从零实现一个 Webpack Loader

参考: Webpack Book --- Extending with Loaders。 Webpack Doc --- Loader Interface Loader 是 Webpack 几大重要的模块之一。当你需要加载资源,就需要设置对应的 Loader,这样就可以对其...

Yzz
06/03
0
0
Android Loader 机制,让你的数据加载更加高效

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

developerHaoz
2017/11/27
0
0
webpack系列之四loader详解2

系列作者:肖磊 GitHub: github.com/CommanderXL 上篇文章主要讲了 loader 的配置,匹配相关的机制。这篇主要会讲当一个 module 被创建之后,使用 loader 去处理这个 module 内容的流程机制。...

滴滴WebApp架构组
02/21
0
0
Proactor模式&Reactor模式详解

服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型。 (2)同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非...

follitude
2016/09/08
272
0
Android 下常用的类库整理

1.GSON:Google提供的用来在Java对象和JSON数据之间进行映射的Java类库。 2.EventBus:简化应用中各个部件之间通信的一个库。 3.UNIVERSAL IMAGE LOADER:可重复使用的仪器为异步图像加载、缓...

IT追寻者
2016/06/17
45
0

没有更多内容

加载失败,请刷新页面

加载更多

python学习10.04:Python list列表使用技巧及注意事项

前面章节介绍了很多关于 list 列表的操作函数,细心的读者可能会发现,有很多操作函数的功能非常相似。例如,增加元素功能的函数有 append() 和 extend(),删除元素功能的有 clear()、 remo...

太空堡垒185
11分钟前
2
0
新手插画学习的方法?教你如何自学?

插画学习的方法?教你如何自学? 从小喜欢画一些漫画头像随笔画,但是其实没有基础。个人偏好小清新手绘风的插画(如下图),每每看到都希望自己能画出这样的作品。 我其实很想说画这种美术功...

huihuajiaocheng
17分钟前
3
0
面试题

1、实现clone();

gtandsn
28分钟前
3
0
CentOS 7 部署 tesseract-ocr

官方地址 github yum-config-manager --add-repo https://download.opensuse.org/repositories/home:/Alexander_Pozdnyakov/CentOS_7/ 若提示 yum-config-manager: command not found 执行以......

阿白
28分钟前
2
0
JAVA比较器中comparator的使用

一个专用的比较器Comparator Comparator是一个专用的比较器,当一个不支持自比较或者自比较函数不能满足要求时,可写一个比较器来完成两个对象之间大小的比较。Comparator体现了一种策略模式...

daxiongdi
29分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部