做了个工具方法,用来下载图片,如果本地有这个图,则不下载,直接展示到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. kafka写入hdfs

    碰到的问题 (1)线程操作问题,因为单机节点,代码加锁就好了,后续再写 (2) 消费者写hdfs的时候以流的形式写入,但是什么时候关闭流就是一个大问题了,这里引入了   fsDataOutputStr ...

  2. java解析json的操作

    import java.io.FileNotFoundException; import java.io.FileReader; import com.google.gson.JsonArray; i ...

  3. python_web框架

    一.web框架 web框架: 自己完成socket的web框架:如,Tornado等 由WSGI完成socket的web框架:如,Django.flash等 两种实现过程: 第二种WSGI方式的,由于 ...

  4. selenium使用遇到的问题(selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH.)

    1.安装pip3 install selenium 2.使用browser=webdriver.Chrome()时报错 :selenium.common.exceptions.WebDriverExc ...

  5. 畅通工程续 -- HDU 1874 floyd

    题目大意: 现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离. 思路: floyd算法模板题,这是一个牺牲空间换取时间的算法,本质是动态规划. AC代码: #include < ...

  6. LPC 网络编程

    LPC有五种不同的通信模式(socket模式) ① MUD (面向连接的通信模式) 可以把除Object以外的所有LPC模型从一个MUD传到另一个MUD 弊端: 无法传送物件造成了穿越MUD的功能(即 ...

  7. 操作redis数据库 & 操作Excel & 开发接口

    操作redis数据库: string类型 1. 增 set,传俩个参数 key value(只要是字符串就行)2. 删 delete 传一个参数 key3. 修改 set 在目标key重新传参 key ...

  8. 借助Docker单机秒开数十万TCP连接

    熟悉网络编程的都清楚系统只有65535个端口可用,1024以下的端口为系统保留,所以除去系统保留端口后可用的只有65411个端口,而一个TCP连接由TCP四元组(源IP.源端口.TCP.目标IP.目标 ...

  9. 转 c#性能优化秘密

    原文:http://www.dotnetperls.com/optimization Generally, using the simplest features of the language pr ...

  10. 初入linux系统

    作为微软的老铁粉了,看到微软进军linux这么久了,是时候该跟上脚本了,不然该落后了,脚步是如此之快,着实让我吃了一惊,说干就干, 绝不是开玩笑的,谁也阻止不了.net开源,跨平台的脚步了.以前别人说 ...