MyTask task = new MyTask();
task.execute(url);
class MyTask extends AsyncTask<String, Integer, Bitmap> {
    // 下载前的操作(主)
    @Override
    protected void onPreExecute() {
        // 下载前需要显示进度条
        dialog = new ProgressDialog(MainActivity.this);
        dialog.setTitle("正在下载");
        dialog.setMessage("请稍候");
        dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); // 水平进度条对话框
        dialog.setMax(100);
        dialog.show();
        super.onPreExecute();
    }

    // 下载图片(子)
    @Override
    protected Bitmap doInBackground(String... params) {
        String url = params[0];// 获取url地址
        HttpClient httpClient = new DefaultHttpClient(); // HttpClient对象
        HttpGet httpGet = new HttpGet(url); // GET请求(url时uri的子类)
        try {
            HttpResponse response = httpClient.execute(httpGet); // 发送GET请求
            // 判断响应的状态码是否为200
            if (response.getStatusLine().getStatusCode() == 200) {
                // 真正的下载数据(图片)
                HttpEntity entity = response.getEntity();
                InputStream is = entity.getContent(); // 获得输入流
                long length = entity.getContentLength(); // 获取文件的总长度
                ByteArrayOutputStream baos = new ByteArrayOutputStream();// 字节数组输出流(专用于保存网络上下载的数据)
                byte[] buffer = new byte[1024]; // 输入缓冲器
                int ret, received = 0; // 接收到多少
                // 屌丝的代码
                while (true) {
                    ret = is.read(buffer); // 真正读到多少字节(最后一次读到的值不一定是1024)
                    if (ret < 0) {
                        break;
                    }
                    // 把buffer的数据先保存到一个靠谱的地方
                    baos.write(buffer, 0, ret);
                    received += ret; // 更新当前接收到的长度
                    int progress = (int) (100 * received / length); // 计算进度值
                    publishProgress(progress); // 发布最新的进度值
                }
                // 大神的代码
                // while((ret = is.read(buffer)) > 0) {
                // baos.write(buffer, 0, ret);
                // }
                byte[] data = baos.toByteArray(); // 流转字节数组
                // 最后的最后,把字节数组转换成图片
                return BitmapFactory.decodeByteArray(data, 0, data.length);
            }
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } // 发送请求(GET POST)

        return null;
    }

    // 发布更新的操作(主)
    @Override
    protected void onProgressUpdate(Integer... values) {
        dialog.setProgress(values[0]);
        super.onProgressUpdate(values);
    }

    // 下载后的操作(主)
    @Override
    protected void onPostExecute(Bitmap result) {
        imageview.setImageBitmap(result);
        // 下载后取消进度条
        dialog.dismiss();
        super.onPostExecute(result);
    }

}

AsyncTask下载网络图片的更多相关文章

  1. Android初学-AsyncTask下载网络图片

    AsyncTask 异步处理: mainfest: 注意添加的: -------------------- <uses-permission android:name="android ...

  2. Android 用AsyncTask下载网络图片并显示百分比

    1.添加布局文件:activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/a ...

  3. AsyncTask下载网络图片的简单应用

    1.imageTest package lpc.com.asynctaskdemo; import android.app.Activity; import android.graphics.Bitm ...

  4. Android开发-下载网络图片并显示到本地

    Android下载网络图片的流程是: 发送网络请求->将图片以流的形式下载下来->将流转换为Bitmap并赋给ImageView控件. 注意点 最新的Android系统不可以在主线程上请求 ...

  5. 使用url下载网络图片以及流介绍

    使用url下载网络图片的时候,首先需要建立一个URL对象,然后使用一个输入流获取该URL中的内容.之后使用读取该输入流的内容,使用一个输出流写到本地文件中.最后关闭输入和输出流.下面是一个简单的下载代 ...

  6. .Net 使用爬虫下载网络图片到本地磁盘

    准备: 1.新建控制台项目 2.引用System.Drawing类库 3.安装HtmlAgilityPack 1.5.2.0 4.如果不会XPath语法的话,建议简单看下 代码: static voi ...

  7. android下载网络图片并缓存

    异步下载网络图片,并提供是否缓存至内存或外部文件的功能 异步加载类AsyncImageLoader public void downloadImage(final String url, final ...

  8. java 下载网络图片

      java 如何下载网络图片 CreateTime--2017年9月30日11:18:19 Author:Marydon 说明:根据网络URL获取该网页上面所有的img标签并下载符合要求的所有图片 ...

  9. Android 异步任务——AsyncTask (附使用AsyncTask下载图片Demo)

    我们编程的时候经常需要处理同步任务和异步任务,在Android里面存在一个特性,就是UI线程是不安全的线程.所谓UI线程不安全也就是我们的主线程(进程启动的第一个线程)不能在线程外操作主线程的资源.因 ...

随机推荐

  1. Ubuntu无法关机解决办法

    说明:如果不成功请参考一下文章最后的内容,也许会有帮助. 其实不止在ubuntu里面,fedora里面我也遇到了这个问题,就是电脑可以重启,但是不能直接关机,否则就一直停在关机界面,需手动关机.郁闷很 ...

  2. Dialog类介绍

    Dialog类实现为一个简单的漂浮窗口,完全在Activity中创建.使用基本的Dialog类,你可以创建一个新的实例并设定标题和布局,如下所示: Dialog d = new Dialog(MyAc ...

  3. Unity 利用NGUI做屏幕分辨率适配+学习UIDraggablePanel的使用

    原地址:http://blog.sina.com.cn/s/blog_697b1b8c0101g2r4.html 大家使用unity,一定有看中其跨平台的强大功能,因此也难免会遇到不同屏幕分辨率适配的 ...

  4. mongo链接报错:couldn't connect to server 127.0.0.1:27017 (127.0.0.1)

    angela@angeladeMacBook-Air:/data/db$mongo MongoDB shell version: 2.6.1 connecting to: test 2014-06-0 ...

  5. 深度学习入门教程UFLDL学习实验笔记二:使用向量化对MNIST数据集做稀疏自编码

    今天来做UFLDL的第二个实验,向量化.我们都知道,在matlab里面基本上如果使用for循环,程序是会慢的一逼的(可以说基本就运行不下去)所以在这呢,我们需要对程序进行向量化的处理,所谓向量化就是将 ...

  6. 24.栈的push和pop序列[StackPushPopSequence]

    [题目] 输入两个整数序列.其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序.为了简单起见,我们假设push序列的任意两个整数都是不相等的. 比如输入的push序列是1.2 ...

  7. 【转】tomcat下部署 solr 5.3.1

    本文转自:http://blog.csdn.net/lianghyan/article/details/49467207 solr下载: http://lucene.apache.org/solr/d ...

  8. MySQL数据库备份和还原的常用命令

    其实很多情况下mysql备份就是采用了这些命令,例如: mysql导入和导出数据 linux自动定时备份web程序和mysql数据库 备份MySQL数据库的命令 mysqldump -hhostnam ...

  9. php对象引用和析构函数的关系

    在php中构造函数和析构函数都属于魔术方法,比如构造函数在某一个类中,当这个类被实例化的时候就会自动调用,而析构函数是在这个类的对象被销毁的时候自动调用,默认情况下是在程序执行结束时自动调用. 如果我 ...

  10. 1.saltstack基础笔记

    环境: master: 节点node1:阿里云:121.42.195.15 centos6.6 minion: 节点node2:腾讯云:182.254.157.19 centos6.6 一.salts ...