Android远程获取图片并本地缓存

2019-12-10 19:06:40丽君

本地缓存优化:

/** 
*计算存储目录下的文件大小,当文件总大小大于规定的CACHE_SIZE或者sdcard剩余空间小于FREE_SD_SPACE_NEEDED_TO_CACHE的规定 
* 那么删除40%最近没有被使用的文件 
* @param dirPath 
* @param filename 
*/ 
private void removeCache(String dirPath) { 
  File dir = new File(dirPath); 
  File[] files = dir.listFiles(); 
  if (files == null) { 
    return; 
  } 
  int dirSize = 0; 
  for (int i = 0; i < files.length;i++) { 
    if(files[i].getName().contains(WHOLESALE_CONV)) { 
      dirSize += files[i].length(); 
    } 
  } 
  if (dirSize > CACHE_SIZE * MB ||FREE_SD_SPACE_NEEDED_TO_CACHE > freeSpaceOnSd()) { 
    int removeFactor = (int) ((0.4 *files.length) + 1); 
 
    Arrays.sort(files, newFileLastModifSort()); 
 
    Log.i(TAG, "Clear some expiredcache files "); 
 
    for (int i = 0; i <removeFactor; i++) { 
 
      if(files[i].getName().contains(WHOLESALE_CONV)) { 
 
        files[i].delete();        
 
      } 
 
    } 
 
  } 
 
} 
/** 
* 删除过期文件 
* @param dirPath 
* @param filename 
*/ 
private void removeExpiredCache(StringdirPath, String filename) { 
 
  File file = new File(dirPath,filename); 
 
  if (System.currentTimeMillis() -file.lastModified() > mTimeDiff) { 
 
    Log.i(TAG, "Clear some expiredcache files "); 
 
    file.delete(); 
 
  } 
 
} 

文件使用时间排序:

/** 
* TODO 根据文件的最后修改时间进行排序 * 
*/ 
classFileLastModifSort implements Comparator<File>{ 
  public int compare(File arg0, File arg1) { 
    if (arg0.lastModified() >arg1.lastModified()) { 
      return 1; 
    } else if (arg0.lastModified() ==arg1.lastModified()) { 
      return 0; 
    } else { 
      return -1; 
    } 
  } 
} 

内存保存: 
在内存中保存的话,只能保存一定的量,而不能一直往里面放,需要设置数据的过期时间、LRU等算法。这里有一个方法是把常用的数据放到一个缓存中(A),不常用的放到另外一个缓存中(B)。当要获取数据时先从A中去获取,如果A中不存在那么再去B中获取。B中的数据主要是A中LRU出来的数据,这里的内存回收主要针对B内存,从而保持A中的数据可以有效的被命中。