美文网首页
AsyncTask异步任务下载多张网络图片

AsyncTask异步任务下载多张网络图片

作者: 草色陆连清 | 来源:发表于2019-10-29 16:44 被阅读0次

因为客户APP需要有一键下载当前图片集合的功能,所以开始研究如何实现下载多张网络图片。刚开始只是简单地使用for循环去遍历每一个网络图片,然后进行下载。但是如此做有以下缺点:1.因为是同时开启下载线程,所以有时会漏掉几张图片(具体原因不明)。2.没办法监听下载状态,下载完成时没有办法及时通知用户。基于以上原因,故使用异步任务AsyncTask。

    private class Mytask extends AsyncTask<List<String>,Integer,String>{

        @Override
        protected String doInBackground(List<String>... params) {
            List<String> list = params[0];
            File file = null;
            Bitmap bitmap = null;
            HttpURLConnection conn = null;
            FileOutputStream outStream = null;
            InputStream is = null;
            try {
                for (String imageurl:list) {
                    file = createStableImageFile(mContext);
                    URL url = new URL(imageurl);
                    conn = (HttpURLConnection) url.openConnection();
                    conn.connect();
                    is = conn.getInputStream();
                    bitmap = BitmapFactory.decodeStream(is);
                    outStream = new FileOutputStream(file);
                    bitmap.compress(Bitmap.CompressFormat.PNG, 100, outStream);
                    MediaStore.Images.Media.insertImage(mContext.getContentResolver(),
                                file.getAbsolutePath(), file.getAbsolutePath(), null);
                    // 最后通知图库更新
                    mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + Environment.getExternalStorageDirectory())));

                }
                is.close();
                outStream.flush();
                outStream.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
//            ToastUtil.show("下载完成");
        }
    }


    //创建本地保存路径
    private static File createStableImageFile(Context context){
        String fileName = System.currentTimeMillis()  + ".jpg";//存放的文件名
        File storageDir = context.getExternalCacheDir();
        File image = new File(storageDir, fileName);
        return image;
    }

在执行下载方法的地方:

 new Mytask().execute(arr);  //arr为网络图片地址集合 ArrayList<String> arr

相关文章

  • AsyncTask异步任务下载多张网络图片

    因为客户APP需要有一键下载当前图片集合的功能,所以开始研究如何实现下载多张网络图片。刚开始只是简单地使用for循...

  • 异步任务AsyncTask下载图片

    一:ANR现象: ==应用程序无响应 == 1.单线程模型的原则: 主线程UI不能被阻塞 非主线程不能更新UI 二...

  • GCD检测多个异步任务完成

    当我们需要在多个异步的任务完成之后去处理某些事情,如异步下载多张图片,等所有图片下载完成之后,再去做一些事情,那么...

  • GCD同步

    dispatch_group_t 一组任务完成后再做其他处理,比如异步下载多张图片,等图片下载完成后再拼接图片显示...

  • 实现多线程下载图片后在布局UI

    Sdwebimage异步下载多张图片 详细dispatch_group_t group 参考:https://ww...

  • AsyncTask相关面试题

    什么是AsyncTask? AsyncTask(异步任务类),比Handler更轻量,更适合简单的异步操作内部实现...

  • AsyncTask 源码分析

    AsyncTask 的使用 Android 提供 AsyncTask 处理异步任务,基于异步消息处理机制,本质上是...

  • 异步下载多张图片并拼接

  • 异步任务AsyncTask

    为甚么要异步任务? 1.Android是单线程模型2.耗时操作要放在非主线程里面执行 构建Asynctask子类的...

  • 异步任务-- AsyncTask

    一、为什么要异步任务?Android单线程模型耗时操作放在非主线程中 二、异步加载最常用的两种方式多线程/线程池A...

网友评论

      本文标题:AsyncTask异步任务下载多张网络图片

      本文链接:https://www.haomeiwen.com/subject/efsgvctx.html