AsyncTask下载图片

package com.bawie.day01;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

/**
* AsyncTask
*/

public class MainActivity extends AppCompatActivity {

private ImageView iv_show;
private String path = "http://pic25.nipic.com/20121121/1837405_112826532165_2.jpg";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    iv_show = (ImageView) findViewById(R.id.iv_show);
}

//点击按钮下载图片
public void downLoadImg(View v) {
    //启动异步任务
    new MyAsyncTask().execute(path);//传入String类型的可变参数
}

/**
 * Params:当前异步任务操作时需要的参数类型
 * Progress:当前异步任务耗时操作的进度类型
 * Result:当前异步任务耗时操作结果的数据类型
 */
//获取下载的网络地址,String,得到的结果byte,耗时操作进度默认为空
class MyAsyncTask extends AsyncTask {

    private ByteArrayOutputStream outputStream;
    private byte[] images;

    //1.异步任务执行之前运行在UI线程中的准备方法 初始化操作
    @Override
    protected void onPreExecute() {
        //获取当前的线程对象,名称
        Log.i("tag", Thread.currentThread().getName() + "----onPreExecute-------");
    }

    //2.重写一个耗时操作的方法,在onPreQExecute()方法之后执行,运行在工作线程中

    /**
     * 该方法的参数类型与类中泛型第一个参数类型一致,
     * 返回值与类中泛型第三个参数一致
     */
    @Override
    protected byte[] doInBackground(String... params) {
        //连接网络获取图片的字节数组
        try {
            outputStream = new ByteArrayOutputStream();
            images = null;
            URL url = new URL(params[0]);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setDoInput(true);
            conn.setRequestMethod("GET");
            conn.connect();//连接
            //响应码
            int responseCode = conn.getResponseCode();
            if (responseCode == 200) {
                InputStream input = conn.getInputStream();
                byte[] data = new byte[1024];
                int temp = 0;
                while ((temp = input.read(data)) != -1) {
                    outputStream.write(data, 0, temp);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        images = outputStream.toByteArray();
        return images;
    }

    //3.当doInBackground()方法执行完之后将耗时操作的结果返回给该方法,展示到UI界面
    @Override
    protected void onPostExecute(byte[] result) {
        //判断结果是否为空
        if (result != null && result.length != 0) {
            //将图片的字节数组转换为图片对象,bitmap对象
            Bitmap bm = BitmapFactory.decodeByteArray(result, 0, result.length);
            iv_show.setImageBitmap(bm);//把下载的图片展示到控件上
        } else {
            Toast.makeText(MainActivity.this, "图片下载失败!", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

布局







你可能感兴趣的:(AsyncTask下载图片)