android缓存机制怎样做交互更好
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android缓存机制怎样做交互更好相关的知识,希望对你有一定的参考价值。
android缓存机制交互优化方法:android中的文字缓存应该分为两种:一种是更新比较频繁的区域,一种是更新不频繁的区域.
1. 文字缓存:
文字缓存应该分为两种,一种是更新比较频繁的区域,一种是更新不频繁的区域.
根据两者的更新频率区分它们的过期时间.
更新比较频繁的区域,它的缓存过期时间应该为应用程序内(即应用程序从打开到关闭的这段时间).这种情况会有专门的缓存文件夹存放该类缓存文件,以及专门的缓存数据库表存放信息.每次应用程序启动的时候都会先将该类数据清空.
另一种很少更新的区域,它的缓存不设置过期时间,而是提供一个按钮或者Menu可以让用户选择手动更新(如我的好友列表,我的订阅,我的分享.等等….)
(1)通常情况下,我们与服务器交互都是采用JSON格式获取数据的,获取的JSON数据仅仅是一段字符串,我们可以考虑将这些字符串使用文件流写入一个TXT,保存到
SD卡中,在数据库添加该数据的记录.添加数据库记录时,提供两个关键字段,一个是
请求的URL,另一个则是本地保存后的文件地址.日后每次向服务器发起请求之前都会根据URL在数据库中检索.
该方法好处:降低系统数据库数据量,不会出现数据库满了的现象.
缺点:IO操作频繁,有时代码书写有误会造成内存泄露等状况.
(2)将JSON数据解析后装入List<Map>对象中,然后遍历List,将数据统统写入相应的数据库表结构中,以后每次向服务器发起请求之前可以先在数据库中检索,如果有直接返回.
该方法好处:如果本地存在文字缓存,那么读取缓存速度快.
缺点:增加数据库数据量. 参考技术A int size = 80000; //缓存大小,Byte
LruCache<String,Object> cache = new LruCache<String, Object>(size)
@Override
protected int sizeOf(String key, Object value)
return super.sizeOf(key, value);
;
安卓实现了LRUCache,按Map的方法操作缓存,加载之前先判断缓存里有没有数据,没有就从外部存储读进去,再加载出来
Android番外篇 LruCache缓存机制
一、引言
Android提供的使用了(Least Recently Used)近期最少使用算法的缓存类,内部基于LinkedHashMap实现。
- 构造时需要确定
Cache
的最大内存
//获取程序最大可用内存
int max = (int)Runtime.getRuntime().maxMemory();
//取可用内存的四分之一做缓存
int size = max/4;
sizeOf()
方法
在添加value到Cache时会被调用,需要返回添加进数据的字节大小
- 在 put(key,value)添加时先通过get(key)判断是否已经有key对应的value存在
二、例子展示
(1)例子一
import android.util.LruCache;
/**
* @author : Dumplings
* @version : v1.0.0
* @ClassName : MyLruCache.java
* @Function : 缓存算法
* @Description : 内存缓存图片Bitmap
* @Idea :
* {@link }
* @Encourage :And the more we try to understand one another, the more exceptional each of us will be.
* 我们越是努力理解他人,自身也越发变得优秀。
* @date : 2021/6/3
*/
public class MyLruCache extends LruCache<String, Bitmap> {
private static MyLruCache myLruCache;
private MyLruCache(int maxSize) {
super(maxSize);
}
public static MyLruCache getMyLruCache() {
if (myLruCache == null) {
int maxMemory = (int) Runtime.getRuntime().maxMemory();
int maxSize = maxMemory / 4;
myLruCache = new MyLruCache(maxSize);
}
return myLruCache;
}
//每次存入bitmap时调用,返回存入的数据大小
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getByteCount();
}
//添加
public void add(String key, Bitmap bitmap) {
if (get(key) == null) {
put(key, bitmap);
}
}
//获取
public Bitmap getBitmap(String key) {
return get(key);
}
}
(2)例子二
import android.util.LruCache;
/**
* @author : Dumplings
* @version : v1.0.0
* @ClassName : MyLruCache.java
* @Function : 缓存算法
* @Description :
* @Idea :
* {@link }
* @Encourage :And the more we try to understand one another, the more exceptional each of us will be.
* 我们越是努力理解他人,自身也越发变得优秀。
* @date : 2021/6/3
*/
public class MyLruCache<T> extends LruCache<String, T> {
private static volatile MyLruCache instance = null;
private MyLruCache(int maxSize) {
super(maxSize);
}
public static <T> MyLruCache getInstance() {
if (instance == null) {
synchronized (MyLruCache.class) {
if (instance == null) {
instance = new MyLruCache<T>(1024 * 1024 * 20);
}
}
}
return instance;
}
}
调用:
MyLruCache<Drawable> myLruCache = MyLruCache.getInstance();
Drawable thatDrawable = myLruCache.get("key");
if (thatDrawable == null) {
//data.getAppIcon() 图片路径 or 图片资源 ...
thatDrawable = data.getAppIcon();
myLruCache.put("key", thatDrawable);
}
//图片控件imageView(你自己的图片控件变量名称)显示
imageView.setBackground(thatDrawable);
以上是关于android缓存机制怎样做交互更好的主要内容,如果未能解决你的问题,请参考以下文章