AsyncTask下载网络图片

时间:2022-08-28 19:14:18
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);
    }

}