金沙注册网站-新金沙官网 新金沙官网 Android使用磁盘缓存DiskLruCache

Android使用磁盘缓存DiskLruCache

本文实例讲述了php使用timthumb生成缩略图的方法。分享给大家供大家参考,具体如下:

DiskLruCache
不同于LruCache,LruCache是将数据缓存到内存中去,而DiskLruCache是外部缓存,例如可以将网络下载的图片永久的缓存到手机外部存储中去,并可以将缓存数据取出来使用,DiskLruCache不是google官方所写,但是得到了官方推荐,DiskLruCache没有编写到SDK中去,如需使用可直接copy这个类到项目中去。

生成缩列图有二种方式:

DiskLruCache地址:
https://android.googlesource.com/platform/libcore/+/android-4.1.1_r1/luni/src/main/java/libcore/io/DiskLruCache.java

一、提前生成好,供调用

或者可以在Jake大神的Github上找到:
https://github.com/JakeWharton/DiskLruCache

缩列图常规做法是,开始根据网站中的图片规格,要生成多少种缩列图,图片上传过程中就会生成缩列,供不同需求去调用。像这种方法有一点不好就是,如果增加图片规格以后,以前上传的图片没有该规格的,还要重新生成。

  • ###### DiskLruCache常用方法:

二、调用的时候在生成缩列图。这也是我写这篇文章原因。

方法 备注
DiskLruCache open(File directory, int appVersion, int valueCount, long maxSize) 打开一个缓存目录,如果没有则首先创建它,directory:指定数据缓存地址 appVersion:APP版本号,当版本号改变时,缓存数据会被清除 valueCount:同一个key可以对应多少文件 maxSize:最大可以缓存的数据量
Editor edit(String key) 通过key可以获得一个DiskLruCache.Editor,通过Editor可以得到一个输出流,进而缓存到本地存储上
void flush() 强制缓冲文件保存到文件系统
Snapshot get(String key) 通过key值来获得一个Snapshot,如果Snapshot存在,则移动到LRU队列的头部来,通过Snapshot可以得到一个输入流InputStream
long size() 缓存数据的大小,单位是byte
boolean remove(String key) 根据key值来删除对应的数据,如果该数据正在被编辑,则不能删除
void delete() 关闭缓存并且删除目录下所有的缓存数据,即使有的数据不是由DiskLruCache 缓存到本目录的
void close() 关闭DiskLruCache,缓存数据会保留在外存中
boolean isClosed() 判断DiskLruCache是否关闭,返回true表示已关闭
File getDirectory() 缓存数据的目录

推荐一个timthumb,个人觉得在不考虑性能,效率的情况下,这个东西,绝对是好用的。

  • ###### 如何使用DiskLruCache:

1,下载地址:

1、因为要操作外部存储,所以必须要先加上权限:

下载下来后,放到你的web环境中,在与timthumb.php平行的目录中建一个cache文件夹,给于755权限,windows的话,就不用了。测试代码如下:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
timthumb 

另外要从网络下载图片,还要加上权限:

w=58 表示图片宽为58h=46 表示图片高为46

 <uses-permission android:name="android.permission.INTERNET" />

可以根据需要,随便设置。

2、DiskLruCache是在外部存储上(如SD卡),所以首先判断外部存储是否存在:

timthumb最大的优点就是方便,目前还没有遇到过这样的工具,缺点同样明显,每次请求的时候,都会调用php-cgi或者是php-cli,缓存的数据放在cache目录下,调用数据要去查找目录,性能上会比较低。

  /**
   * Get a usable cache directory (external if available, internal otherwise).
   * external:如:/storage/emulated/0/Android/data/package_name/cache
   * internal 如:/data/data/package_name/cache
   *
   * @param context    The context to use
   * @param uniqueName A unique directory name to append to the cache dir
   * @return The cache dir
   */
  public static File getDiskCacheDir(Context context, String uniqueName) {
      final String cachePath = Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) ||!isExternalStorageRemovable() 
              ? context.getExternalCacheDir().getPath()
              : context.getCacheDir().getPath();
      return new File(cachePath + File.separator + uniqueName);
  }

希望本文所述对大家PHP程序设计有所帮助。

(1)、首先判断外部缓存是否被移除或已存满,如果已存满或者外存储被移除,则缓存目录=context.getCacheDir().getPath(),即存到
/data/data/package_name/cache 这个文件系统目录下;
(2)、反之缓存目录=context.getExternalCacheDir().getPath(),即存到
/storage/emulated/0/Android/data/package_name/cache
这个外部存储目录中,PS:外部存储可以分为两种:一种如上面这种路径
(/storage/emulated/0/Android/data/package_name/cache),
当应用卸载后,存储数据也会被删除,另外一种是永久存储,即使应用被卸载,存储的数据依然存在,存储路径如:/storage/emulated/0/mDiskCache,可以通过*Environment.getExternalStorageDirectory().getAbsolutePath()

  • “/mDiskCache”* 来获得路径。

3、根据URL下载一个在线图片并把它写到输出流outputstream中:

  /**
     * Download a bitmap from a URL and write the content to an output stream.
     *
     * @param urlString The URL to fetch
     * @return true if successful, false otherwise
     */
    private boolean downloadUrlToStream(String urlString, OutputStream outputStream) {
        HttpURLConnection urlConnection = null;
        BufferedOutputStream out = null;
        BufferedInputStream in = null;

        try {
            final URL url = new URL(urlString);
            urlConnection = (HttpURLConnection) url.openConnection();
            in = new BufferedInputStream(urlConnection.getInputStream(), IO_BUFFER_SIZE);
            out = new BufferedOutputStream(outputStream, IO_BUFFER_SIZE);
            int b;
            while ((b = in.read()) != -1) {
                out.write(b);
            }
            return true;
        } catch (Exception e) {
            Log.e(TAG, "Error in downloadBitmap - " + e);
        } finally {
            if (urlConnection != null) {
                urlConnection.disconnect();
            }
            try {
                if (out != null) {
                    out.close();
                }
                if (in != null) {
                    in.close();
                }
            } catch (final IOException e) {
            }
        }
        return false;
    }

4、上面已经下载了图片,接着初始化DiskLruCache,并使用DiskLruCache.Editor准备缓存:

  private static final int MAX_SIZE = 10 * 1024 * 1024;//10MB
    private DiskLruCache diskLruCache;
    private void initDiskLruCache() {
        if (diskLruCache == null || diskLruCache.isClosed()) {
            try {
                File cacheDir = CacheUtil.getDiskCacheDir(this, "CacheDir");
                if (!cacheDir.exists()) {
                    cacheDir.mkdirs();
                }
                //初始化DiskLruCache
                diskLruCache = DiskLruCache.open(cacheDir, 1, 1, MAX_SIZE);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图