做了个工具方法,用来下载图片,如果本地有这个图,则不下载,直接展示到view

setHP()方法可以多次使用,因为使用了线程池,所以是个异步操作,如果使用的多,建议根据需要增加线程池的线程数量

看代码:参数为线程数,自定义设置

//线程池
private ExecutorService executorService = Executors.newFixedThreadPool(2); //具体方法,参数:第一个是服务器需要下载的文件名(图片名),第二个是要展示的view,已经实例化,这里不展示
 void setHP(String filename, de.hdodenhof.circleimageview.CircleImageView cde) {
executorService.submit(new Runnable() {
@Override
public void run() {
// 判断本地是否有该图片
//本地存放图片的具体路径
String mfileName = Objects.requireNonNull(getContext()).getExternalCacheDir() + "/paipaixiu/" + filename; File file = new File(mfileName);
          //判断是否存在
if (file.exists() && !file.isDirectory()) {
//存在,直接加载
//不需要判断Android版本
try {
              //直接由真实路径加载,转换成bitmap类型
Bitmap bitmap = BitmapFactory.decodeFile(mfileName);
Objects.requireNonNull(getActivity()).runOnUiThread(new Runnable() {
@Override
public void run() {
                  //展示到想要的view,即第二个参数
cde.setImageBitmap(bitmap);
}
});
} catch (Exception e) {
file.delete();
}
} else {
          //本地不存在,需要从服务器下载
OkHttpClient client = new OkHttpClient();
Request request;
Response response;
            //参数u是该图片在服务器的具体网址路径,我已经提前处理好了,这里就不展示了,
String u = url2 + "/" + filename; request = new Request.Builder()
.url(u)
.build();
try {
response = client.newCall(request).execute();
//返回的结果
final byte[] bytes = response.body().bytes();
//在子线程转换,减少负担,二进制流转换成bitmap类型
final Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
Objects.requireNonNull(getActivity()).runOnUiThread(new Runnable() {
@Override
public void run() {
                    //展示到想要的view,即第二个参数
cde.setImageBitmap(bitmap);
}
});               //保存下载好的文件到本地,要在线程里进行保存,Android里创建文件,必须先存在文件夹才能创建文件,需要逐步确认才可以,这个坑,花了我大半天时间才搞清楚
//先判断文件夹是否存在,不存在才新建用mkdirs();,可以新建多级文件夹
File fd = new File(Objects.requireNonNull(getContext()).getExternalCacheDir() + "/paipaixiu");
if (!fd.exists() || !fd.isDirectory()) {
fd.mkdirs();
}
//然后判断文件是否存在,不存在才新建,用createNewFile();,仅仅用来新建文件夹
File fp = new File(fd + "/" + filename);
if (!fp.exists()) {
fp.createNewFile();
}
//只有文件新建好了,才可以使用使字符流保存到文件里,这里保存的是个.png图片
              //开启字符流
FileOutputStream fos = new FileOutputStream(fp);
              //写入
fos.write(bytes, 0, bytes.length);
              //结束写入
fos.flush();
              //关闭字符流
fos.close(); } catch (IOException e) {
e.printStackTrace();
}
}
}
}); }

Android-线程池下载多个图片并保存,如果本地有该图,则不下载,直接展示到view的更多相关文章

  1. 使用URLConnection下载文件或图片并保存到本地

    有时候需要从网络上面下载图片到本地进行保存,代码如下: package com.jointsky.jointframe.test; import java.io.FileOutputStream; i ...

  2. Android(java)学习笔记267:Android线程池形态

    1. 线程池简介  多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.     假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...

  3. android线程池ThreadPoolExecutor的理解

    android线程池ThreadPoolExecutor的理解 线程池 我自己理解看来.线程池顾名思义就是一个容器的意思,容纳的就是ThreadorRunable, 注意:每一个线程都是需要CPU分配 ...

  4. android 线程池的使用

    转自http://www.trinea.cn/android/java-android-thread-pool/ Java(Android)线程池 介绍new Thread的弊端及Java四种线程池的 ...

  5. Android(java)学习笔记211:Android线程池形态

    1. 线程池简介  多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.     假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...

  6. Android 线程池概念及使用

    一:使用线程池的原因 在android开发中经常会使用多线程异步来处理相关任务,而如果用传统的newThread来创建一个子线程进行处理,会造成一些严重的问题: 在任务众多的情况下,系统要为每一个任务 ...

  7. 最强大的Android线程池框架

    背景 大家都知道在我们的开发中永远都离不开多线程,对于我们为什么要使用多线程,多线程的使用和多线程的一些基础知识这里我们就不讲了,有兴趣的朋友可以去看一下博主之前的几篇文章: 线程你真的了解它吗 这才 ...

  8. 下载远程(第三方服务器)文件、图片,保存到本地(服务器)的方法、保存抓取远程文件、图片 将图片的二进制字节字符串在HTML页面以图片形式输出 asp.net 文件 操作方法

    下载远程(第三方服务器)文件.图片,保存到本地(服务器)的方法.保存抓取远程文件.图片   将一台服务器的文件.图片,保存(下载)到另外一台服务器进行保存的方法: 1 #region 图片下载 2 3 ...

  9. 微信小程序生成分享图片,保存到本地

    1.页面 <canvas canvas-id="shareCanvas" style="width:600px;height:900px">< ...

随机推荐

  1. Unity引擎相关知识UnityKnowledgeHyperlink

    请简述Unity中的四种坐标系 http://liuqingwen.me/blog/2017/07/31/understanding-coordinate-system-in-unity3d/

  2. 「JOISC 2018 Day 3」比太郎的聚会

    题解: 很套路的题目 我们按照询问中的不算的个数是否大于$block$分类 如果大于,就$O(n)dp$一下 如果小于,就预处理出到每个点前$block$小的点 $block取\sqrt{n}$的话复 ...

  3. postgresql drop表后空间不释放

    数据库执行drop table XXX后,查看du -sh 已下降,但df -h /pgdb没有减少,是有还有进程使用对应的文件句柄 1.通过表名确认文件ID select pg_relation_f ...

  4. 将最小的OWIN身份验证添加到现有的ASP.NET MVC应用程序

    https://weblog.west-wind.com/posts/2015/Apr/29/Adding-minimal-OWIN-Identity-Authentication-to-an-Exi ...

  5. caffe 根据txt生成多标签LMDB数据

    1. 前提: 已经准备好train.txt, test.txt文件, 格式如下 此处有坑, 如果是windows下生成txt, 换行符为\r\n, 需要替换成 \n才能在linux运行. 可以使用se ...

  6. Little Sub and Isomorphism Sequences ZOJ - 4089

    ZOJ - 4089 思路:可以反正 最长重构序列必然符合  此模式 x  +  {   }  与  {   }  +  x 那么 题意转化为了  找两个距离最长的相同的数.eeee 先离散化 然后 ...

  7. java -ui自动化初体验

    本文来讲一下ui自动化的环境搭建,以及最初级的打开网页操作 说起ui自动化,想想大概是前年的时候我开始接触和学习的吧,怎么说呢无论是pc还是app,ios还是android,确实很神奇而且很华丽,但是 ...

  8. QEMU, a Fast and Portable Dynamic Translator-Fabrice Bellard-翻译

    Abstract We present the internals of QEMU, a fast machine emulator using an original portable dynami ...

  9. 错误解决记录------------rhel安装Mysql软件包依赖 mariadb组件

    错误解决记录------------软件包依赖 mariadb组件 错误信息: 错误:软件包:akonadi-mysql-1.9.2-4.el7.x86_64 (@anaconda) 需要:maria ...

  10. Chapter 5 : Control Structures 2 : Repetition

    import java.util.*; import java.io.*; public class Loop { static Scanner console = new Scanner(Syste ...