zoukankan      html  css  js  c++  java
  • 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();
    }
    }
    }
    });


    }

  • 相关阅读:
    win10安装jmeter配置环境路径
    genymotion在mac上的安装
    jmeter的启动
    win10的cmd输入javac的问题
    01 | 你真的懂测试吗?从“用户登录”测试谈起 茹炳晟
    冒烟测试
    软件测试基础知识
    红队指南--第3章 列举
    REDTEAM 指南---第四章 外部侦察
    Red Team 指南-第1章 红队和红队概述
  • 原文地址:https://www.cnblogs.com/c2g5201314/p/10789885.html
Copyright © 2011-2022 走看看