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<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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值