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<String, Void, byte[]> {
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();
}
}
}
}
布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.bawie.day01.MainActivity">
<ImageView
android:id="@+id/iv_show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:src="@mipmap/ic_launcher" />
<Button
android:id="@+id/btn_down"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:onClick="downLoadImg"
android:text="点击下载" />
</RelativeLayout>