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实现。

  1. 构造时需要确定Cache的最大内存
 	//获取程序最大可用内存
    int max = (int)Runtime.getRuntime().maxMemory();
    //取可用内存的四分之一做缓存
    int size = max/4;
  1. sizeOf() 方法
	在添加value到Cache时会被调用,需要返回添加进数据的字节大小
  1. 在 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缓存机制怎样做交互更好的主要内容,如果未能解决你的问题,请参考以下文章

android 怎么做数据缓存

Android 【手撕Glide】--Glide缓存机制(面试)

android开发中怎样缓存数据

Android-Glide的缓存机制

Hibernate缓存机制

彻底解析Android缓存机制——LruCache