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

做了个工具方法,用来下载图片,如果本地有这个图,则不下载,直接展示到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();
}
}
}
});


}

 

posted @ 2019-04-29 13:35  岑惜  阅读(1152)  评论(0编辑  收藏  举报