顺序

先if内存

else  if  sd卡

else 网络获取

网络获取

网络获取 分别存入  内存和sd

先上代码

创建一个用来自定义的类

public class ImageUtil {private static ImageUtil imageUtil;private static final String TAG = "ImageUtil";//3级内存LruCache<String, Bitmap> cache;private String path;ExecutorService executorService;private ImageUtil(){executorService = Executors.newSingleThreadExecutor();int l = (int) (Runtime.getRuntime().maxMemory() / 10);//initcache = new LruCache<String,Bitmap>(l){@Overrideprotected int sizeOf(String key, Bitmap value) {return value.getByteCount();}};}public static ImageUtil getInstance(){if(imageUtil == null){synchronized (ImageUtil.class){if(imageUtil == null){imageUtil = new ImageUtil();}}}return imageUtil;}private Handler handler = new Handler() {@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);Bitmap bitmap = (Bitmap) msg.obj;myListener.click(bitmap);}};public void loading(final String url){//http://www.qubaobei.com/ios/cf/uploadfile/132/3/2127.jpgfinal String name = url.substring(url.lastIndexOf("/")+1,url.lastIndexOf("."));//1,先内存里面读取final Bitmap bitmap = cache.get(name);if(bitmap !=null){//Log.i(TAG, "loading: 从内存读取");//如果内存有,就读取myListener.click(bitmap);}else{//2,sd卡里读取Bitmap bitmap1 = BitmapFactory.decodeFile(new File(Environment.getExternalStorageDirectory() + File.separator + "image" + File.separator, name + ".jpg").getAbsolutePath());if(bitmap1 != null){Log.i(TAG, "loading: 从sd卡读取");myListener.click(bitmap1);//放入到内存一份cache.put(name,bitmap1);}else{//3,从网络上读取executorService.execute(new Runnable() {@Overridepublic void run() {//从网络下载Log.i(TAG, "run: 从网络中读取");try {URL url1 = new URL(url);HttpURLConnection urlConnection =(HttpURLConnection) url1.openConnection();if(urlConnection.getResponseCode() == 200){InputStream inputStream = urlConnection.getInputStream();//Bitmap bitmap1 = BitmapFactory.decodeStream(inputStream);//1,存sd
//                                Environment.getExternalStorageState()saveToSd(bitmap1, name);//2,存到内存cache.put(name,bitmap1);//发送Message obtain = Message.obtain();obtain.obj = bitmap1;handler.sendMessage(obtain);}} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}});}}}/*** 保存到sd* @param bitmap1* @param name* @throws FileNotFoundException*/private void saveToSd(Bitmap bitmap1, String name) throws FileNotFoundException {if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){///storage/emulated/0/image/File file = new File(Environment.getExternalStorageDirectory() + File.separator + "image" + File.separator);///storage/emulated/0/image/2127.jgpif(!file.exists()){file.mkdirs();}File file1 = new File(file, name+".jpg");path = file1.getAbsolutePath();Log.i(TAG, "saveToSd: "+path);FileOutputStream fileOutputStream = new FileOutputStream(file1);bitmap1.compress(Bitmap.CompressFormat.JPEG,100,fileOutputStream);}}public interface MyListener{void click(Bitmap bitmap);}private MyListener myListener;public void setMyListener(MyListener myListener) {this.myListener = myListener;}
}

主类  MainActivity

public class MainActivity extends AppCompatActivity implements ImageUtil.MyListener {private Button btn;private ImageView img;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn = (Button) findViewById(R.id.btn);img = (ImageView) findViewById(R.id.img);ImageUtil instance = ImageUtil.getInstance();instance.setMyListener(this);requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE},100);}public void loading(View view) {ImageUtil.getInstance().loading("http://www.qubaobei.com/ios/cf/uploadfile/132/3/2127.jpg");}@Overridepublic void click(Bitmap bitmap) {img.setImageBitmap(bitmap);}
}

附上           XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="loading"android:onClick="loading"android:id="@+id/btn"></Button><ImageViewandroid:src="@mipmap/ic_launcher"android:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/img"></ImageView>
</LinearLayout>

嘿-----------------------最后可别忘记加上权限嗷·~

三级缓存 SD—内存—网络相关推荐

  1. 使用三级缓存解决内存溢出

    在Android开发的过程中,涉及到图片通常容易产生内存溢出的问题, 使用三级缓存的思路可以比较好的解决这个问题. 如下图所示为三级缓存的示意图,第一级为内存缓存,第二级为软引用缓存,第三级为文件缓存 ...

  2. Android图片三级缓存(网络,本地,内存)介绍及简单实现

    三级缓存使用的必要性 假如每次启动的时候都从网络拉取图片的话,势必会消耗很多流量.在当前的状况下,对于非wifi用户来说,流量还是很贵的,一个很耗流量的应用,其用户数量级肯定要受到影响 当我们想要重复 ...

  3. Android 系统(173)---Android中图片的三级缓存

    Android中图片的三级缓存 为什么要使用三级缓存 如今的 Android App 经常会需要网络交互,通过网络获取图片是再正常不过的事了 假如每次启动的时候都从网络拉取图片的话,势必会消耗很多流量 ...

  4. 缓存、内存、硬盘、虚拟硬盘

    CPU缓存的容量比内存小的多但是交换速度却比内存要快得多.缓存的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾,因为CPU运算速度要比内存读写速度快很多,这样会使CPU花费很长时间等待数据 ...

  5. Android 浅析Glide三级缓存

    Android 简要分析Glide三级缓存 概括 Glide version is 4.8.0 Glide拥有三级缓存,分别为 当前正在使用得资源缓存(ActiveResources) 内存缓存(Lr ...

  6. 一级缓存、二级缓存、三级缓存

    缓冲/存储技术 +关注 大家都知道CPU缓存很重要,但对于缓存的具体细分却知之甚少,本文只要是关于CPU缓存的介绍,并着重描述了一级缓存.二级缓存.三级缓存区别方法. CPU缓存 CPU缓存(Cach ...

  7. CPU中的一级缓存,二级缓存,三级缓存

    缓存又叫高速缓冲存储器,其作用在于缓解主存速度慢.跟不上CPU读写速度要求的矛盾.        缓存的实现原理,是把CPU最近最可能用到的少量信息(数据或指令)从主存复制到CACHE中,当CPU下次 ...

  8. 浅谈CPU三级缓存和缓存命中率

    CPU: 文章迁移:说说CPU三级缓存和缓存命中率 - 码到城攻说说CPU三级缓存和缓存命中率https://www.codecomeon.com/posts/95/ CPU缓存(Cache Memo ...

  9. 一级缓存、二级缓存、三级缓存区别是什么 详解它们的区分方法

    大家都知道CPU缓存很重要,但对于缓存的具体细分却知之甚少,本文只要是关于CPU缓存的介绍,并着重描述了一级缓存.二级缓存.三级缓存区别方法. CPU缓存 CPU缓存(Cache Memory)是位于 ...

  10. 【CPU缓存】一级二级三级缓存

    CPU缓存   CPU缓存(Cache Memory)是位于 CPU 与内存之间的临时存储器,它的容量比内存小的多,但是交换速度却快得多.   CPU运算速度要比内存读写速度快很多,这样会使CPU花费 ...

最新文章

  1. 加速、能耗与对抗攻击:5位顶会作者解析2020 AI系统关键挑战
  2. 分享一张SQLSERVER执行流程的图片
  3. rbpf粒子滤波slam matlab程序_学习笔记(优达学城)- 车辆定位之粒子滤波器(整合版)...
  4. html input不能输入小数_第三课:变量与输入输出的配合使用
  5. 【RPC】你应该知道的 RPC 原理
  6. windows环境里React-Native运行失败的原因之一,安卓模拟器未启动
  7. 【.NET Core项目实战-统一认证平台】第八章 授权篇-IdentityServer4源码分析
  8. 前端学习(1138):正则表达式里面的量词符
  9. 多个相同参数表单提交
  10. oracle inside(4)
  11. cass绘制围墙lisp_CASS中用LISP完成高程值的可视化处理
  12. 虚拟机+Ubuntu+filezilla连接
  13. 一个没暂时没有办法实现的问题和一个有意思的小问题!
  14. c语言程序设计cspn,Null-terminated wide strings
  15. 计算机结构系统的发展趋势,计算机体系结构的现状及发展趋势.docx
  16. VB6 自定义 Msgbox 和 InputBox 消息框
  17. 为什么要面向对象编程?
  18. Dorado7 notify非alert 输入框prompt confirm layer dialoger,layer.msg,toast效果,几秒关闭layer.load layer.open
  19. cocos2d-x小游戏——飞机大战
  20. 基于MSGEQ7的音乐节奏灯超详细适合入门

热门文章

  1. 大学的第一堂必修课:军训
  2. 数据安全合格有哪些要求
  3. Graphene 2.0.0.Alpha4,Selenium 的 Ajax 测试扩展
  4. iOS经典讲解之播放本地音频文件
  5. 动词ing形式的5种用法_动词ing形式的用法及变化规则
  6. 5G无线技术基础自学系列 | 大规模天线阵列
  7. 两种微生物并肩作战 让生物光伏系统发电能力创新高
  8. 【Java】为什么不推荐程序员去外包公司?
  9. zabbix Too many processes on xxx
  10. 转载:wps怎么制作半圆形时间轴? wps彩色时间轴的制作方法