• Android内存优化之磁盘缓存


    前言:

    上一篇文章中介绍了内存缓存,内存缓存的长处就是非常快。可是它又有缺点:

    • 空间小,内存缓存不可能非常大;
    • 内存紧张时可能被清除;
    • 在应用退出时就会消失,做不到离线。

    基于以上的缺点有时候又须要第二种缓存,那就是磁盘缓存。大家应该都用过新闻client,非常多都有离线功能,功能的实现就是磁盘缓存。

    DiskLruCache:

    在Android中用到的磁盘缓存大多都是基于DiskLruCache实现的,详细怎么使用呢?

    • 创建一个磁盘缓存对象:

    public static DiskLruCache open(File directory, int appVersion, int valueCount, long maxSize);
    open()方法接收四个參数。第一个參数是数据的缓存文件地址,第二个參数是当前应用程序的版本,第三个參数是同一个key能够相应多少个缓存文件。一般都是传1,第四个參数是最多能够缓存多少字节的数据,10M?

    • 获取缓存路径:

    // Creates a unique subdirectory of the designated app cache directory. Tries to use external
    // but if not mounted, falls back on internal storage.
    //创建磁盘缓存文件。首选sdcard,假设sdcard没有挂载或者没有sdcard则获取应用默认的cache文件夹
    public static File getDiskCacheDir(Context context, String uniqueName) {
        // Check if media is mounted or storage is built-in, if so, try and use external cache dir
        // otherwise use internal cache dir
        final String cachePath =
                Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) ||
                        !isExternalStorageRemovable() ? getExternalCacheDir(context).getPath() :
                                context.getCacheDir().getPath();
    
        return new File(cachePath + File.separator + uniqueName);
    }

    • 获取软件版本:

    public int getAppVersion(Context context) {
    		try {
    			PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
    			return packageInfo.versionCode;
    		} catch (NameNotFoundException e) {
    			e.printStackTrace();
    		}
    		return 1;
    	}

    • 完整的代码例如以下:

    DiskLruCache mDiskLruCache = null;
    try {
    	File cacheDir = getDiskCacheDir(context, "thumbnails");
    	if (!cacheDir.exists()) {
    		cacheDir.mkdirs();
    	}
    	mDiskLruCache = DiskLruCache.open(cacheDir, getAppVersion(context), 1, 10 * 1024 * 1024);
    } catch (IOException e) {
    	e.printStackTrace();
    }

    • 详细怎么使用上面创建的磁盘缓存例如以下:

    //加入缓存
    public void addBitmapToCache(String key, Bitmap bitmap) {
        // Add to memory cache as before,把缓存放到内存缓存中
        if (getBitmapFromMemCache(key) == null) {
            mMemoryCache.put(key, bitmap);
        }
    
        // Also add to disk cache,把缓存放入磁盘缓存
        synchronized (mDiskCacheLock) {
            if (mDiskLruCache != null && mDiskLruCache.get(key) == null) {
                mDiskLruCache.put(key, bitmap);
            }
        }
    }
    //获取缓存
    public Bitmap getBitmapFromDiskCache(String key) {
        synchronized (mDiskCacheLock) {
            // Wait while disk cache is started from background thread
            while (mDiskCacheStarting) {
                try {
                    mDiskCacheLock.wait();
                } catch (InterruptedException e) {}
            }
            if (mDiskLruCache != null) {
                return mDiskLruCache.get(key);
            }
        }
        return null;
    }

    总结:

    以上是磁盘缓存的创建和用法。在实际操作中内存缓存和磁盘缓存是配合起来使用的。一般先从内存缓存中读取数据,假设没有再从磁盘缓存中读取。

    个人水平有限。有什么问题能够留言,最好是加入我的公众号:coder_online,我能及时的看到你的留言并给你答复。

    想第一时间获得很多其它原创文章,请关注个人微信公众平台:程序猿互动联盟(coder_online)。扫一扫下方二维码或者搜索微信号coder_online就可以关注,里面有大量Android,Chromium,Linux,编程技巧等相关文章等着您,我们还能够在线交流。

    image010-258x250


  • 相关阅读:
    Python图形编程探索系列-07-程序登录界面设计
    英语初级学习系列-05-阶段1总结
    Python图形编程探索系列-06-按钮批量生产函数
    英语初级学习系列-04-年龄
    Python图形编程探索系列-05-用控制变量构建对话程序
    Python图形编程探索系列-04-网上图片与标签组件的结合
    Python图形编程探索系列-03-标签组件(Label)
    Python解释数学系列——分位数Quantile
    Python图形编程探索系列-02-框架设计
    Python图形编程探索系列-01-初级任务
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/6702273.html
Copyright © 2020-2023  润新知