使用AsyncTask完成点击按钮下载图片到ImageView控件上

import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

// TODO 使用异步任务实现点击按钮下载图片到ImageView控件上
public class MainActivity extends Activity {

    private ImageView imageView;
    private static final String IMAGE_PATH = "http://b.hiphotos.baidu.com/image/pic/item/279759ee3d6d55fbb3586c0168224f4a20a4dd7e.jpg";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView = (ImageView) findViewById(R.id.iv_01);
    }

    public void btnClick(View view) {        //点击按钮
        new MyTask().execute(IMAGE_PATH);   //开启异步任务
    }

    //    AsyncTask是个抽象类,继承时需要设定三个泛型ParamsProgressResult的类型 如
//    Params  是指调用execute()方法时传入的参数类型和doInBackgound()的参数类型
//    Progress是指更新进度时传递的参数类型,即publishProgress()onProgressUpdate()的参数类型
//    Result  是指doInBackground()的返回值类型
    class MyTask extends AsyncTask, Integer, Bitmap> {

        private ProgressDialog dialog;//带进度条的提示框

        //第一个执行的方法,这个方法在主线程中 做一些准备工作  例如:弹出进度匡
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            dialog = new ProgressDialog(MainActivity.this);
            dialog.setTitle("提示!!");
            dialog.setMessage("正在下载中....");
            dialog.show();
        }

        //在子线程中执行  其他方法在主线程中执行直接可以进行耗时操作
        @Override
        protected Bitmap doInBackground(String... params) {
            String path = params[0];//传递过来的条件
            ByteArrayOutputStream outputStream = null;
            try {
                URL url = new URL(path);
                //开启连接
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();     //开启链接
                conn.setReadTimeout(5000);      //设置读取超时事件
                conn.connect();
                if (conn.getResponseCode() == 200) {
                    InputStream inputStream = conn.getInputStream();  //获取输入流
                    outputStream = new ByteArrayOutputStream();//创建输出流
                    byte[] bt = new byte[8 * 1024];
                    int len = 0;
                    while ((len = inputStream.read(bt)) != -1) {
                        outputStream.write(bt, 0, len);
                        outputStream.flush();
                    }
                    byte[] array = outputStream.toByteArray(); //把输出流转化成Byte数组
                    //doInBackground方法中进行return 就会把return的数据传到onPostExecute
                    return BitmapFactory.decodeByteArray(array, 0, array.length);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (outputStream != null) {
                    try {
                        outputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return null;
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
        }

        @Override
        protected void onPostExecute(Bitmap result) {
            super.onPostExecute(result);
            if (result != null) {
                imageView.setImageBitmap(result); //设置控件,显示图片,主线程的onPostExecute可以改变控件状态,子线程则不能.
            }
            dialog.dismiss();// 关闭onPreExecute中开启的Dialog
        }
    }
}

你可能感兴趣的:(使用AsyncTask完成点击按钮下载图片到ImageView控件上)