我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android图片加载的缓存类

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android图片加载的缓存类

本文为大家分享了Android图片加载的缓存类,供大家参考,具体内容如下


import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.lang.ref.SoftReference; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.util.LinkedHashMap; 
import java.util.concurrent.ConcurrentHashMap; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.Build; 
import android.os.Handler; 
import android.text.TextUtils; 
 
public class ImageLoaderEngine { 
  public static final int LOAD_IMG_SUCCESS = 2010; 
  private final int MAX_CAPACITY = Build.VERSION.SDK_INT > Build.VERSION_CODES.GINGERBREAD_MR1 ? 50 : 10;// 一级缓存缓存图片数 
  private static ImageLoaderEngine instance; 
  private static Handler mHandler; 
  private ExecutorService pool;// 后台线程池 
  // 这里用LinkedHashMap不用LruCache的原因是LruCache直接申请内存大小而不是图片个数。此App已经有一个全局的LruCache了,重复申请内存大小对应用不利 
  private LinkedHashMap<String, Bitmap> mFirstLevelCache;// <momentId>一级缓存,硬链接bitmap,只保留最近用的图片。 
  private ConcurrentHashMap<String, SoftReference<Bitmap>> mSecondLevelCache;// <momentId> 
  public static ImageLoaderEngine getInstance(Handler handler) { 
    if (instance == null) { 
      instance = new ImageLoaderEngine(); 
    } 
    if(handler != null) { 
      mHandler = handler; 
    } 
    return instance; 
  } 
  private ImageLoaderEngine() { 
    pool = Executors.newFixedThreadPool(4);// 默认线程池大小为6 
    initCache(); 
  } 
  private void initCache() { 
    mFirstLevelCache = new LinkedHashMap<String, Bitmap>(MAX_CAPACITY / 2, 
        0.75f, true) { 
      private static final long serialVersionUID = 1L; 
      protected boolean removeEldestEntry(Entry<String, Bitmap> eldest) { 
        if (size() > MAX_CAPACITY) {// 超过一级缓存大小后会挪到二级缓存中 
          mSecondLevelCache.put(eldest.getKey(), 
              new SoftReference<Bitmap>(eldest.getValue())); 
          return true; 
        } 
        return false; 
      }; 
    }; 
    mSecondLevelCache = new ConcurrentHashMap<String, SoftReference<Bitmap>>();// <momentId> 
  } 
   
  public void deleteCacheByKey(String key) { 
    String sdCacheingPath = IOHelper.getCachedPicturePath( 
        Global.packageName, key); 
    String sdCacheedPath = sdCacheingPath +".png"; 
    File file = new File(sdCacheingPath); 
    if(file.exists()) { 
      file.delete(); 
    } 
    file = new File(sdCacheedPath); 
    if(file.exists()) { 
      file.delete(); 
    } 
    mFirstLevelCache.remove(key); 
    mSecondLevelCache.remove(key); 
  } 
   
  public void recycleImageLoader() { 
    new Thread(new Runnable() { 
      @Override 
      public void run() { 
        if (pool != null) { 
          pool.shutdownNow(); 
        } 
        if (mFirstLevelCache != null) { 
          for (Bitmap bmp : mFirstLevelCache.values()) { 
            if (bmp != null) { 
              bmp.recycle(); 
              bmp = null; 
            } 
          } 
          mFirstLevelCache.clear(); 
          mFirstLevelCache = null; 
        } 
        if (mSecondLevelCache != null) { 
          mSecondLevelCache.clear(); 
        } 
        mHandler = null; 
      } 
    }).start(); 
  } 
   
  public void loadImageByMoment(final NMoment moment,String photoTag) { 
    if (moment.isPicture() 
        || moment.isVideo()) { 
      String id = moment.id + photoTag; 
      loadImageByUrl(id+"", moment.getPicture(Global.widthPixels/3*2),moment.orientation); 
    } 
  } 
   
  public void loadImageByUrl(final String key,final String url,final int orientation) { 
      pool.submit(new Runnable() { 
        public void run() { 
          LogHelper.e("ImageLoaderEngine","从网络中下载"); 
          // 如果内存中有就算了 
          if (mFirstLevelCache.get(key) != null 
              || mSecondLevelCache.get(key) != null) {// 如果图片已经缓存了 
            LogHelper.e("ImageLoaderEngine","下载图片错误 1"); 
            return; 
          } 
          // 如果SD卡缓存中有就算了 
          final String sdCacheingPath = IOHelper.getCachedPicturePath( 
              Global.packageName, key); 
          File cacheingFile = new File(sdCacheingPath); 
          if (cacheingFile.exists()) {// 如果正在缓存就算了 
            long currentTime = System.currentTimeMillis(); 
            if((currentTime - cacheingFile.lastModified()) >2 * 60 * 1000) { 
              LogHelper.e("ImageLoaderEngine","2分钟都还没下载完,准备删除它.."+currentTime+"="+cacheingFile.lastModified()); 
              cacheingFile.delete(); 
            } else { 
              getBitmapFromNetworkAndAddToMemory(url, key, orientation); 
              LogHelper.e("ImageLoaderEngine","第二次进来应该走这里.."); 
              return; 
            } 
          } 
          String sdCacheedPath = sdCacheingPath + ".png";// 缓存完成后会改名字,否则会导致缓存错误,图片变黑 
          File cacheedFile = new File(sdCacheedPath); 
          if (cacheedFile.exists()) {// 如果缓存了就算了 
            LogHelper.e("ImageLoaderEngine","下载图片错误 2"); 
            return; 
          } 
          getBitmapFromNetworkAndAddToMemory(url, key, orientation); 
        } 
      }); 
  } 
  private void getBitmapFromNetworkAndAddToMemory(String url,String key,int orientation) { 
    Bitmap bmp = getBitmapFromUrl(url); 
    if(bmp!= null) { 
      LogHelper.e("ImageLoaderEngine","下载网络图片成功"); 
      if(key.endsWith("_DetailDaily")) { 
        bmp = scaledBitmap(bmp, Global.getThumbWidth()); 
      } 
      if(orientation != 0) { 
        mFirstLevelCache.put(key, ViewHelper.rotateBitmap(orientation, bmp));// 从网络下载后直接显示 
      } else { 
        mFirstLevelCache.put(key, bmp);// 从网络下载后直接显示 
      } 
      if (mHandler != null) { 
        mHandler.removeMessages(LOAD_IMG_SUCCESS); 
        mHandler.sendEmptyMessageDelayed( 
            LOAD_IMG_SUCCESS, 600);// 延时提示没有数据了 
      } 
      final String sdCacheingPath = IOHelper.getCachedPicturePath( 
          Global.packageName, key); 
      saveBitmapToFile(sdCacheingPath, bmp); 
    } else { 
      LogHelper.e("ImageLoaderEngine","下载网络图片失败..."); 
    } 
  } 
   
  public Bitmap getBitmapFromUrl(String url) { 
    URL myFileUrl = null; 
    Bitmap bitmap = null; 
    InputStream is = null; 
    try { 
      if (!UIUtils.isNetworkAvailable(MyApplication.getInstance())) { 
        return null; 
      } 
      myFileUrl = new URL(url); 
      HttpURLConnection conn = (HttpURLConnection) myFileUrl 
          .openConnection(); 
      conn.setDoInput(true); 
      conn.connect(); 
      is = conn.getInputStream(); 
      bitmap = BitmapFactory.decodeStream(is); 
    } catch (Exception e) { 
      try { 
        if(is != null) { 
          is.close(); 
        } 
      } catch (IOException e1) { 
        e1.printStackTrace(); 
      } 
      e.printStackTrace(); 
    } 
    return bitmap; 
  } 
  public Bitmap getImageInMemory(NMoment moment) { 
    return getImageInMemory(moment, ""); 
  } 
   
  public Bitmap getImageInMemory(NMoment moment, String photoTag) { 
    String id = moment.id + photoTag; 
    Bitmap bmp = null; 
    // 1. 从一级缓存中获取 
    bmp = getFromFirstLevelCache(id); 
    if (bmp != null && !bmp.isRecycled()) { 
      LogHelper.e("ImageLoaderEngine","一级缓存获取:"+id); 
      return bmp; 
    } 
    // 2. 从二级缓存中获取 
    bmp = getFromSecondLevelCache(id); 
    if (bmp != null && !bmp.isRecycled()) { 
      LogHelper.e("ImageLoaderEngine","二级缓存获取:"+id); 
      return bmp; 
    } 
    if(bmp != null && bmp.isRecycled()) { 
      return null; 
    } else { 
      return bmp; 
    } 
  } 
  public void setImage(String key,Bitmap picture) { 
    mFirstLevelCache.put(key, picture); 
  } 
   
  public Bitmap getImage(NMoment moment) { 
    return getImage(moment, ""); 
  } 
  public Bitmap getImage(NMoment moment, String photoTag) { 
    String id = moment.id + photoTag; 
    Bitmap bmp = null; 
    // 1. 从一级缓存中获取 
    bmp = getFromFirstLevelCache(id); 
    if (bmp != null && !bmp.isRecycled()) { 
      LogHelper.e("ImageLoaderEngine","一级缓存获取:"+id); 
      return bmp; 
    } 
    // 2. 从二级缓存中获取 
    bmp = getFromSecondLevelCache(id); 
    if (bmp != null && !bmp.isRecycled()) { 
      LogHelper.e("ImageLoaderEngine","二级缓存获取:"+id); 
      return bmp; 
    } 
    // 3. 从SD卡缓存中获取 
    bmp = getFromSDCache(moment, photoTag); 
    if (bmp != null && !bmp.isRecycled()) { 
      LogHelper.e("ImageLoaderEngine","SD卡缓存获取:"+id); 
      return bmp; 
    } 
    // 4. 从网络中获取 
    loadImageByMoment(moment, photoTag);  
//    LogHelper.e("ImageLoaderEngine","本地获取图片失败:"+moment.id+"="+moment.getPicture()); 
    if(bmp != null && bmp.isRecycled()) { 
      return null; 
    } else { 
      return bmp; 
    } 
  } 
  public Bitmap getImage(String key,String url) { 
    Bitmap bmp = null; 
    // 1. 从一级缓存中获取 
    bmp = getFromFirstLevelCache(key); 
    if (bmp != null && !bmp.isRecycled()) { 
      return bmp; 
    } 
    // 2. 从二级缓存中获取 
    bmp = getFromSecondLevelCache(key); 
    if (bmp != null && !bmp.isRecycled()) { 
      return bmp; 
    } 
    // 3. 从SD卡缓存中获取 
    bmp = getFromSDCacheByKey(key,0); 
    if (bmp != null && !bmp.isRecycled()) { 
      return bmp; 
    } 
    // 4. 从网络中获取 
    loadImageByUrl(key, url,0); 
    if(bmp != null && bmp.isRecycled()) { 
      return null; 
    } else { 
      return bmp; 
    } 
  } 
   
  private Bitmap getFromFirstLevelCache(String imgId) { 
    Bitmap bitmap = null; 
    synchronized (mFirstLevelCache) { 
      bitmap = mFirstLevelCache.get(imgId); 
      if (bitmap != null) { 
        mFirstLevelCache.remove(imgId); 
        mFirstLevelCache.put(imgId, bitmap); 
      } 
    } 
    return bitmap; 
  } 
   
  private Bitmap getFromSecondLevelCache(String imgId) { 
    Bitmap bitmap = null; 
    SoftReference<Bitmap> softReference = mSecondLevelCache.get(imgId); 
    if (softReference != null) { 
      bitmap = softReference.get(); 
      if (bitmap == null) { 
        mSecondLevelCache.remove(imgId); 
      } 
    } 
    return bitmap; 
  } 
   
  private Bitmap getFromSDCache(final NMoment moment,final String photoTag) { 
    Bitmap drawable = null; 
    String id = moment.id + photoTag; 
    String sdCacheingPath = IOHelper.getCachedPicturePath(Global.packageName, 
        id); 
    String sdCacheedPath = sdCacheingPath + ".png"; 
    if(moment.isLocal){ 
      if(moment.isVideo()) { 
        //获取本地路径 
        sdCacheedPath = moment.getPicture(Global.widthPixels/3*2); 
      } else { 
        sdCacheedPath = moment.local_res_path; 
      } 
    } 
    File cacheFile = new File(sdCacheedPath); 
    if (!cacheFile.exists()) {// 如果没有缓存完成就退出 
      LogHelper.e("ImageLoaderEngine","找不到缓存文件:"+sdCacheedPath); 
      if(!TextUtils.isEmpty(moment.local_res_path)) {// 如果本地有图片,就先用本地图片代替 
        sdCacheedPath = moment.local_res_path; 
        cacheFile = new File(sdCacheedPath); 
        if (cacheFile.exists() && !GlobalData.PHONE_MANUFACTURER.equalsIgnoreCase("samsung")) { 
          LogHelper.e("ImageLoaderEngine","AK47...:"+GlobalData.PHONE_MANUFACTURER);// 先从本地找替代图片.. 
          new Thread(new Runnable() {// 从网络下载 
            @Override 
            public void run() { 
              loadImageByMoment(moment, photoTag);  
            } 
          }).start(); 
          return getFitPhoto(sdCacheedPath, moment, cacheFile); 
        } else { 
          return null; 
        } 
      } else { 
        return null; 
      } 
    } 
    drawable = getFitPhoto(sdCacheedPath, moment, cacheFile); 
    if (drawable != null) { 
      if (moment.orientation != 0) { 
        drawable = ViewHelper 
            .rotateBitmap(moment.orientation, drawable); 
      } 
      if(mFirstLevelCache != null) { 
        mFirstLevelCache.put(id, drawable); 
      } 
    } else { 
      cacheFile.delete(); 
    } 
    return drawable; 
  } 
  private Bitmap getFitPhoto(String sdCacheedPath,NMoment moment,File cacheFile) { 
    FileInputStream fs = null; 
    Bitmap result; 
    try { 
      BitmapFactory.Options options = new BitmapFactory.Options(); 
      options.inJustDecodeBounds = true; 
      BitmapFactory.decodeFile(sdCacheedPath, options); 
      int hRatio = (int) Math.ceil(options.outHeight 
          / (float) moment.picture_height); // 算高度 
      int wRatio = (int) Math.ceil(options.outWidth 
          / (float) Global.widthPixels); // 算宽度 
      if (hRatio > 1 || wRatio > 1) { 
        if (hRatio > wRatio) { 
          options.inSampleSize = hRatio; 
        } else 
          options.inSampleSize = wRatio; 
      } 
      options.inPurgeable = true; 
      options.inInputShareable = true; 
      options.inDither = false; 
      options.inJustDecodeBounds = false; 
      try { 
        fs = new FileInputStream(cacheFile); 
      } catch (FileNotFoundException e) { 
        e.printStackTrace(); 
      } 
      result = BitmapFactory.decodeFileDescriptor(fs.getFD(), null, 
          options); 
    } catch (Exception e) { 
      throw new RuntimeException(e); 
    } finally { 
      if (fs != null) { 
        try { 
          fs.close(); 
        } catch (IOException e) { 
          e.printStackTrace(); 
        } 
      } 
    } 
    return result; 
  } 
  private Bitmap getFromSDCacheByKey(String key,int orientation) { 
    Bitmap drawable = null; 
    FileInputStream fs = null; 
    String sdCacheedPath = IOHelper.getCachedPicturePath( 
        Global.packageName, key) + ".png"; 
    File cacheFile = new File(sdCacheedPath); 
    if (!cacheFile.exists()) {// 如果没有缓存完成就退出 
      return null; 
    } 
    try { 
      BitmapFactory.Options options = new BitmapFactory.Options(); 
      options.inJustDecodeBounds = true; 
      BitmapFactory.decodeFile(sdCacheedPath, options); 
      int wRatio = (int) Math.ceil(options.outWidth 
          / (float) Global.widthPixels); // 算宽度 
      options.inSampleSize = wRatio; 
      options.inPurgeable = true; 
      options.inInputShareable = true; 
      options.inDither = false; 
      options.inJustDecodeBounds = false; 
      try { 
        fs = new FileInputStream(cacheFile); 
      } catch (FileNotFoundException e) { 
        e.printStackTrace(); 
      } 
      drawable = BitmapFactory.decodeFileDescriptor(fs.getFD(), null, 
          options); 
      if (drawable != null) { 
        if(orientation != 0) { 
          drawable = ViewHelper.rotateBitmap(orientation, drawable); 
        } 
        mFirstLevelCache.put(key, drawable); 
      } else { 
        cacheFile.delete(); 
      } 
    } catch (Exception e) { 
      throw new RuntimeException(e); 
    } finally { 
      if (fs != null) { 
        try { 
          fs.close(); 
        } catch (IOException e) { 
          e.printStackTrace(); 
        } 
      } 
    } 
    return drawable; 
  } 
   
  public Bitmap getDefaultBitmap(NMoment moment) { 
    return ImageHelper.createBitmap(moment.picture_width, moment.picture_height, 
        R.color.image_bg_daily); 
  } 
   
  public void saveBitmapToFile(String filePath, Bitmap mBitmap) { 
    try { 
      File file = new File(filePath); 
      if (!file.getParentFile().exists()) { 
        file.getParentFile().mkdirs(); 
      } 
      if (file.exists() && file.length() > 0) { 
        long currentTime = System.currentTimeMillis(); 
        if ((currentTime - file.lastModified()) > 2 * 60 * 1000) { 
          LogHelper.e("ImageLoaderEngine", 
              "2分钟都还没下载完,准备删除它.." + currentTime + "=" 
                  + file.lastModified()); 
          file.delete(); 
        } else { 
          return; 
        } 
      } else { 
        file.createNewFile(); 
      } 
      FileOutputStream fOut = null; 
      fOut = new FileOutputStream(file); 
      mBitmap.compress(Bitmap.CompressFormat.JPEG, 80, fOut); 
      fOut.flush(); 
      fOut.close(); 
      file.renameTo(new File(filePath+".png")); 
    } catch (Exception e) { 
      e.printStackTrace(); 
      LogHelper.e("ImageLoaderEngine","保存图片错误:"+e); 
    } 
    LogHelper.e("ImageLoaderEngine","保存网络图片成功"+filePath+".png"); 
  } 
   
  public boolean saveUrlBitmapToFile(String url, String filePath) { 
      if (TextUtils.isEmpty(filePath)) { 
        return false; 
      } 
    File iconFile = new File(filePath); 
    if (iconFile.getParentFile() == null) { 
        return false; 
    } 
    if (!iconFile.getParentFile().exists()) { 
      iconFile.getParentFile().mkdirs(); 
    } 
    if (iconFile.exists() && iconFile.length() > 0) { 
      long currentTime = System.currentTimeMillis(); 
      if((currentTime - iconFile.lastModified()) >2 * 60 * 1000) { 
        LogHelper.e("ImageLoaderEngine","2分钟都还没下载完,准备删除它.."+currentTime+"="+iconFile.lastModified()); 
        iconFile.delete(); 
      } else { 
        return true; 
      } 
    } 
    FileOutputStream fos = null; 
    InputStream is = null; 
    try { 
      fos = new FileOutputStream(filePath); 
      is = new URL(url).openStream(); 
      int data = is.read(); 
      while (data != -1) { 
        fos.write(data); 
        data = is.read(); 
      } 
    } catch (IOException e) { 
      LogHelper.e("ImageLoaderEngine", "ImageLoaderEngine 下载图片错误" + e); 
      iconFile.delete(); 
      e.printStackTrace(); 
      return false; 
    } finally { 
      try { 
        if (is != null) { 
          is.close(); 
        } 
        if (fos != null) { 
          fos.close(); 
        } 
      } catch (IOException e) { 
        e.printStackTrace(); 
      } 
    } 
    iconFile.renameTo(new File(filePath+".png")); 
    return true; 
  } 
   
  public Bitmap scaledBitmap(Bitmap bmp,int scaledValue) { 
    int bmpWidth = bmp.getWidth(); 
    int bmpHeight = bmp.getHeight(); 
    if(bmpWidth >= bmpHeight) {// 横图 
      bmpWidth = (bmpWidth * scaledValue / bmpHeight); 
      bmpHeight = scaledValue; 
    } else { 
      bmpHeight = (bmpHeight * scaledValue / bmpWidth); 
      bmpWidth = scaledValue; 
    } 
    Bitmap scaledBmp = Bitmap.createScaledBitmap(bmp,bmpWidth,bmpHeight,true); 
    bmp.recycle(); 
    bmp = null; 
    return scaledBmp; 
  } 
} 

以上就是一个完整的Android图片加载缓存类,希望对大家的学习有所帮助。

您可能感兴趣的文章:Android中使用Bitmap类将矩形图片转为圆形的方法非常实用的Android图片工具类Android开发之多媒体文件获取工具类实例【音频,视频,图片等】Android开发之图片压缩工具类完整实例Android开发实现的IntentUtil跳转多功能工具类【包含视频、音频、图片、摄像头等操作功能】Android开发之超强图片工具类BitmapUtil完整实例Android图片处理工具类BitmapUtilsAndroid开发之图片切割工具类定义与用法示例Android编程图片加载类ImageLoader定义与用法实例分析Android编程图片操作类定义与用法示例【拍照,相册选图及裁剪】


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android图片加载的缓存类

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android图片加载的缓存类

本文为大家分享了Android图片加载的缓存类,供大家参考,具体内容如下import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundEx
2022-06-06

Android图片加载缓存框架Glide

Glide开源框架是Google推荐的图片加载和缓框架,其在Github上的开源地址是:https://github.com/bumptech/glide 当然一个Google推荐的框架肯定就是Volley啦。 目前Android主流开发工
2022-06-06

Android中Glide加载图片并实现图片缓存

今天工作中遇到Glide的缓存问题,之前在项目中一直用Glide加载本地及网络图片,但是没有考虑过缓存的问题,但是需求中需要提到了,所以在网上查了一下,再这里和大家简单的分享一下Glide的使用方法以及缓存 首先,Glide是Github
2022-06-06

Android实现图片缓存与异步加载

ImageManager2这个类具有异步从网络下载图片,从sd读取本地图片,内存缓存,硬盘缓存,图片使用动画渐现等功能,已经将其应用在包含大量图片的应用中一年多,没有出现oom。 Android程序常常会内存溢出,网上也有很多解决方案,如软
2022-06-06

Android二级缓存加载图片实现照片墙功能

实现二级缓存加载图片的功能,在使用DiskLruCache时,需先在工程中添加名为libcore.io的包,并将DiskLruCache.Java文件放进去。DiskLruCache直接百度下载即可。在GridView的适配器中,为Imag
2023-05-31

Android开发中ImageLoder进行图片加载和缓存

图片处理类:package com.longfei.admin.imageloder_text; import android.app.Application; import android.graphics.Bitmap; import
2022-06-06

Android实现图片异步加载及本地缓存

在android项目中访问网络图片是非常普遍性的事情,如果我们每次请求都要访问网络来获取图片,会非常耗费流量,而且图片占用内存空间也比较大,图片过多且不释放的话很容易造成内存溢出。针对上面遇到的两个问题,首先耗费流量我们可以将图片第一次加载
2022-06-06

Android实现从缓存中读取图片与异步加载功能类

本文实例讲述了Android实现从缓存中读取图片与异步加载功能类。分享给大家供大家参考,具体如下: 在新浪微博的微博列表中的图片,为了加速其显示也为了加快程序的响应,可以参考该图片异步加载类实现。public class AsyncImag
2022-06-06

Android实现图片异步加载并缓存到本地

在android应用开发的时候,加载网络图片是一个非常重要的部分,很多图片不可能放在本地,所以就必须要从服务器或者网络读取图片。 软引用是一个现在非常流行的方法,用户体验比较好,不用每次都需要从网络下载图片,如果下载后就存到本地,下次读取时
2022-06-06

Android中Glide加载库的图片缓存配置究极指南

零、选择Glide 为什么图片加载我首先推荐Glide 图片加载框架用了不少,从afinal框架的afinalBitmap,Xutils的BitmapUtils,老牌框架universalImageLoader,著名开源组织square的p
2022-06-06

android异步加载图片并缓存到本地实现方法

在android项目中访问网络图片是非常普遍性的事情,如果我们每次请求都要访问网络来获取图片,会非常耗费流量,而且图片占用内存空间也比较大,图片过多且不释放的话很容易造成内存溢出。针对上面遇到的两个问题,首先耗费流量我们可以将图片第一次加载
2022-06-06

Android中使用二级缓存、异步加载批量加载图片完整案例

一、问题描述 Android应用中经常涉及从网络中加载大量图片,为提升加载速度和效率,减少网络流量都会采用二级缓存和异步加载机制,所谓二级缓存就是通过先从内存中获取、再从文件中获取,最后才会访问网络。内存缓存(一级)本质上是Map集合以ke
2022-06-06

Android Universal ImageLoader 缓存图片

项目介绍: Android上最让人头疼的莫过于从网络获取图片、显示、回收,任何一个环节有问题都可能直接OOM,这个项目或许能帮到你。Universal Image Loader for Android的目的是为了实现异步的网络图片加载、缓存
2022-06-06

Android使用缓存机制实现文件下载及异步请求图片加三级缓存

首先给大家介绍Android使用缓存机制实现文件下载 在下载文件或者在线浏览文件时,或者为了保证文件下载的正确性,需要使用缓存机制,常使用SoftReference来实现。SoftReference的特点是它的一个实例保存对一个Java对象
2022-06-06

Android 加载大图、多图和LruCache缓存详细介绍

我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状、不同的大小,但在大多数情况下,这些图片都会大于我们程序所需要的大小。比如说系统图片库里展示的图片大都是用手机摄像头拍出来的,这些图片的分辨率会比我们手机屏幕的
2022-06-06

怎么理解Flutter图片加载与缓存机制

本篇内容主要讲解“怎么理解Flutter图片加载与缓存机制”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解Flutter图片加载与缓存机制”吧!前言今天来学习一下 Flutter 自身是如
2023-06-25

android中图片加载到内存的实例代码

本文演示android中图片加载到内存首先设计界面:代码如下:2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录