zoukankan      html  css  js  c++  java
  • android 图片缓存

    一、Picasso

    https://github.com/square/picasso

    Picasso是Square公司开源的一个Android平台上的图片加载框架,简单易用,一句话搞定项目中的图片加载,好用到令人发指。

    使用一句话:Picasso.with(this).load("url").placeholder(R.mipmap.ic_default).into(imageView);

    二、Glide

    https://github.com/bumptech/glide

    Glide 是 Google 一位员工的大作,他完全是基于 Picasso 的,沿袭了 Picasso 的简洁风格,但是在此做了大量优化与改进。

    Glide 默认的 Bitmap 格式是 RGB_565 格式,而 Picasso 默认的是 ARGB_8888 格式,这个内存开销要小一半

    在磁盘缓存方面,Picasso 只会缓存原始尺寸的图片,而 Glide 缓存的是多种规格,也就意味着 Glide 会根据你 ImageView 的大小来缓存相应大小的图片尺寸,比如你 ImageView 大小是200*200,原图是 400*400 ,而使用 Glide 就会缓存 200*200 规格的图,而 Picasso 只会缓存 400*400 规格的。这个改进就会导致 Glide 比 Picasso 加载的速度要快,毕竟少了每次裁剪重新渲染的过程。

    最重要的一个特性是 Glide 支持加载 Gif 动态图,而 Picasso 不支持该特性

    除此之外,还有很多其他配置选项的增加。

    总体来说,Glide 是在 Picasso 基础之上进行的二次开发,各个方面做了不少改进,不过这也导致他的包比 Picasso 大不少,不过也就不到 500k,Picasso 是100多k,方法数也比 Picasso 多不少,不过毕竟级别还是蛮小的,影响不是很大。

    三、Fresco

    https://github.com/facebook/fresco

    Fresco 是 Facebook 出品,他是新一代的图片加载库,我们知道 Android 应用程序可用的内存有限,经常会因为图片加载导致 OOM,虽然我们有各种手段去优化,尽量减少出现 OOM 的可能性,但是永远没法避免,尤其某些低端手机 OOM 更是严重。而 Facebook 就另辟蹊径,既然没法在 Java 层处理,我们就在更底层的 Native 堆做手脚。于是 Fresco 将图片放到一个特别的内存区域叫 Ashmem 区,就是属于 Native 堆,图片将不再占用 App 的内存,Java 层对此无能为力,这里是属于 C++ 的地盘,所以能大大的减少 OOM。

    本人四个库都使用了一遍,对比到Fresco确实强大,加载大图Fresco最屌,有的图Glide和Picasso加载不出来,换上Fresco妥妥的,不过Fresco比较庞大,

    推荐在主要都是图片的app中使用,一般的app使用Glide和Picasso就够了!

    个人普遍使用Glide

    Glide的获取缓存大小和清理缓存:

    package com.media.project.manufacture.util;

    import android.content.Context;
    import android.os.Looper;
    import android.text.TextUtils;

    import com.bumptech.glide.Glide;
    import com.bumptech.glide.load.engine.cache.ExternalCacheDiskCacheFactory;
    import com.bumptech.glide.load.engine.cache.InternalCacheDiskCacheFactory;

    import java.io.File;
    import java.math.BigDecimal;

    /**
    * Created by wenrisheng on 16/11/11.
    */

    public class GlideCacheUtil {
    private static GlideCacheUtil inst;

    public static GlideCacheUtil getInstance() {
    if (inst == null) {
    inst = new GlideCacheUtil();
    }
    return inst;
    }

    /**
    * 清除图片磁盘缓存
    */
    public void clearImageDiskCache(final Context context) {
    try {
    if (Looper.myLooper() == Looper.getMainLooper()) {
    new Thread(new Runnable() {
    @Override
    public void run() {
    Glide.get(context).clearDiskCache();
    // BusUtil.getBus().post(new GlideCacheClearSuccessEvent());
    }
    }).start();
    } else {
    Glide.get(context).clearDiskCache();
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }

    /**
    * 清除图片内存缓存
    */
    public void clearImageMemoryCache(Context context) {
    try {
    if (Looper.myLooper() == Looper.getMainLooper()) { //只能在主线程执行
    Glide.get(context).clearMemory();
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }

    /**
    * 清除图片所有缓存
    */
    public void clearImageAllCache(Context context) {
    clearImageDiskCache(context);
    clearImageMemoryCache(context);
    String ImageExternalCatchDir=context.getExternalCacheDir()+ ExternalCacheDiskCacheFactory.DEFAULT_DISK_CACHE_DIR;
    deleteFolderFile(ImageExternalCatchDir, true);
    }

    /**
    * 获取Glide造成的缓存大小
    *
    * @return CacheSize
    */
    public String getCacheSize(Context context) {
    try {
    return getFormatSize(getFolderSize(new File(context.getCacheDir() + "/"+ InternalCacheDiskCacheFactory.DEFAULT_DISK_CACHE_DIR)));
    } catch (Exception e) {
    e.printStackTrace();
    }
    return "";
    }

    /**
    * 获取指定文件夹内所有文件大小的和
    *
    * @param file file
    * @return size
    * @throws Exception
    */
    private long getFolderSize(File file) throws Exception {
    long size = 0;
    try {
    File[] fileList = file.listFiles();
    for (File aFileList : fileList) {
    if (aFileList.isDirectory()) {
    size = size + getFolderSize(aFileList);
    } else {
    size = size + aFileList.length();
    }
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    return size;
    }

    /**
    * 删除指定目录下的文件,这里用于缓存的删除
    *
    * @param filePath filePath
    * @param deleteThisPath deleteThisPath
    */
    private void deleteFolderFile(String filePath, boolean deleteThisPath) {
    if (!TextUtils.isEmpty(filePath)) {
    try {
    File file = new File(filePath);
    if (file.isDirectory()) {
    File files[] = file.listFiles();
    for (File file1 : files) {
    deleteFolderFile(file1.getAbsolutePath(), true);
    }
    }
    if (deleteThisPath) {
    if (!file.isDirectory()) {
    file.delete();
    } else {
    if (file.listFiles().length == 0) {
    file.delete();
    }
    }
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }

    /**
    * 格式化单位
    *
    * @param size size
    * @return size
    */
    private static String getFormatSize(double size) {

    double kiloByte = size / 1024;
    if (kiloByte < 1) {
    return size + "Byte";
    }

    double megaByte = kiloByte / 1024;
    if (megaByte < 1) {
    BigDecimal result1 = new BigDecimal(Double.toString(kiloByte));
    return result1.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "KB";
    }

    double gigaByte = megaByte / 1024;
    if (gigaByte < 1) {
    BigDecimal result2 = new BigDecimal(Double.toString(megaByte));
    return result2.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "MB";
    }

    double teraBytes = gigaByte / 1024;
    if (teraBytes < 1) {
    BigDecimal result3 = new BigDecimal(Double.toString(gigaByte));
    return result3.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "GB";
    }
    BigDecimal result4 = new BigDecimal(teraBytes);

    return result4.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "TB";
    }
    }

    解决上传用户头像后因为缓存原因头像没有更新的方案:
    1.每次上传用户头像后台返回的头像url都不一样就可以每次都缓存加载不同的头像
    2.加载用户头像时不缓存头像:
    Glide
    .with(Context)
    .load(url)
    .centerCrop()
    .crossFade()
    .diskCacheStrategy(DiskCacheStrategy.NONE)
    .skipMemoryCache(true)
    .placeholder(R.drawable.profile_logo)
    .into(imageView);
  • 相关阅读:
    Homekit_Dohome_智能灯带
    智能蓝牙球泡灯
    域名与网站名区别
    手机屏幕的分辨率和图像尺寸关系
    关于背景图片定位问题
    http://selectorgadget.com/
    经典网址
    进度条
    html5 触摸控制
    html背景音乐
  • 原文地址:https://www.cnblogs.com/wenrisheng/p/6053446.html
Copyright © 2011-2022 走看看