接上篇《android开发艺术探索》读书笔记(十一)--Android的线程和线程池

No1:

目前比较常用的缓存策略是LruCache和DiskLruCache,LruCache常被用作内存缓存,DiskLruCache常被用作存储设备缓存。

Lru是Least Recently Used的缩写,即最近最少使用算法,当缓存快满时,会淘汰近期最少使用的缓存目标。

No2:

LruCache:

LruCache是一个泛型类,它内部采用一个LinkedHashMap以强引用的方式存储外界的缓存对象,其提供了get和put方法来完成缓存的获取和添加操作,当缓存满时,LruCache会移除较早使用的缓存对象,然后再添加新的缓存对象。

LruCache是线程安全的

public class LruCache<K,V>{
private final LinkedHashMap<K,V> map;
...
}

初始化过程

int maxMemory = (int)(Runtime.getRuntime().maxMemory()/1024);
int cacheSize = maxMemory/8;
mMemoryCache = new LruCache<String,Bitmap>(cacheSize){
@Override
protected int sizeOf(String key,Bitmap bitmap){
return bitmap.getRowBytes()*bitmap.getHeight()/1024;
}
};

获取一个缓存对象

mMemoryCache.get(key)

添加一个缓存对象

mMemoryCache.put(key,bitmap)

No3:

DiskLruCache创建

private static final long DISK_CACHE_SIZE = 1024*1024*50;//50MB
File diskCacheDir = getDiskCacheDir(mContext,"bitmap");
if(!diskCacheDir.exists()){
diskCacheDir.mkdirs();
}
//磁盘缓存在文件系统中的存储路径,应用的版本号,单个节点对应的数据个数,缓存的总大小
mDiskLruCache = DiskLruCache.open(diskCacheDir,1,1DISK_CACHE_SIZE);

建议:如果应用卸载后就希望删除缓存文件,俺么就选择SD卡上的缓存目录,如果希望保留缓存数据那就应该选择SD卡上的其他特定目录

No4:

DiskLruCache的缓存添加:

操作是通过Editor完成的,Editor表示一个缓存对象的编辑对象。

例如:首先需要获取图片url所对应的key,然后根据key就可以通过edit()来获取Editor对象

//一般采用url的md5值作为key
String key hashKeyFormUrl(url);
DiskLruCache.Editor editor = mDiskLruCache.edit(key);
if(editor != null){
//DISK_CACHE_INDEX常量设为0
OutputStream outputStream = editor.newOutputStream(DISK_CACHE_INDEX);
}

必须通过Editor.commit()来提交写入操作,如果过程发生异常,可以通过Editor.abort()来回退整个操作。

No5:

DiskLruCache缓存查找

Bitmap bitmap = null;
String key = hashKeyFormUrl(url);
DiskLruCache.Snapshot snapShot = mDiskLruCache.get(key);
if(snapShot!=null){
FileInputStream fileInputStream = (FileInputStream)snapShot.getInputStream(DISK_CACHE_INDEX);
FileDescriptor fileDescriptor = fileInputStream.getFD();
bitmap = mImageResizer.decodeSampledBitmapFromFileDescriptor(fileDescriptor,reqWidth,reqHeight);
if(bitmap!=null){
addBitmapToMemoryCache(key,bitmap);
}
}

No6:

ImageLoader

No7:

优化列表的卡顿现象

1)不要在Adapter的getView中执行耗时操作,必须异步处理

2)控制异步任务的执行频率:ListView和GridView在滑动的时候停止加载图片

public void onScrollStateChanged(AbsListView view,int scrollState){
if(scrollState == OnScrollListener.SCROLL_STATE_IDLE){
mIsGridViewIdle = true;
mImageAdapter.notifyDataSetChanged();
}else{
mIsGridViewIdle = false;
}
}

在getView中,仅当列表静止时才能加载图片

if(mIsGridViewIdle && mCanGetBitmapFromNetWork){
imageView.setTag(uri);
mImageLoader.bindBitmap(uri,imageView,mImageWidth,mImageWidth);
}

3)开启硬件加速

android:hardwareAccelerated="true"

为Activity开启硬件加速

最新文章

  1. 6.js模式-中介者模式
  2. Oracle利用external table 查看trace文件
  3. xcode升级,报错 libxml/tree.h not found (Xcode4.6解决方案)
  4. EasyUI样式在IE下无法显示原因总结
  5. mysql select 报错
  6. 给postgresql 创建新的用户
  7. 【js】基本类型和引用类型的区别
  8. 201521123080《Java程序设计》第10周学习总结
  9. AUC计算 - 进阶操作
  10. php的依赖注入容器
  11. Netty 系列五(单元测试).
  12. HttpClient 测试web API上传文件实例
  13. Linux 下挂载新硬盘方法
  14. 剑指Offer 23. 二叉搜索树的后序遍历序列 (二叉搜索树)
  15. VS2015和SVN合作
  16. English trip -- VC(情景课)1 C What&#39;s your name?
  17. 想3分钟搭建图像识别系统?这里有一份TensorFlow速成教程(转)
  18. opencv中的洪水填充算法
  19. Android Studio Ffmpeg
  20. 安装配置openstack-dashboard(horizon)

热门文章

  1. 《JavaScript权威指南》读书笔记——JavaScript核心
  2. linkin大话面向对象--方法详解
  3. 完美解决打开github速度慢的问题
  4. CSS 自动隐藏文字并添加省略号
  5. appium GUI介绍
  6. 简单的.editconfig文件
  7. 创建github仓库的gh-pages分支
  8. iOS-Runtime的那些事...编辑中....
  9. Nmap简单扫描
  10. 梅安森元图地图开放平台、专业GIS地图平台