AsyncTask(异步操作)

翻阅官方文档,把重要的内容截取下来。
这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

引用大神的讲解:

http://www.cnblogs.com/dawei/archive/2011/04/18/2019903.html

这里做了一个例子是下载网络上的图片:

先看一下在手机上模拟的效果:

这里写图片描述

activity_main.xml

<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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.downloadimage.MainActivity" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerInParent="true"
        android:src="@drawable/ic_launcher" />

    <Button
        android:id="@+id/btn_download"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:background="#7CB342"
        android:text="下载"
        android:onClick="downLoadImage"
        android:textColor="#fff"
        android:textSize="20sp" />

</RelativeLayout>

MainActivity.java

package com.example.downloadimage;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;

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 android.widget.Toast;

public class MainActivity extends Activity {

    private ImageView iv;
    private String PATH = "https://pixabay.com/static/uploads/photo/2015/10/16/01/09/ad-990314_960_720.jpg";// 图片的地址

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

    }

    // 按钮的点击事件
    public void downLoadImage(View v) {
        new MyAsyncTask().execute(PATH);// 将图片的地址放在这里,等会可以在异步任务里进行转换成图片
    }

    /*
     * 自定义MyAsyncTask,并重写AsyncTask其中的三个参数 第一个是params:执行下载操作时候传入的参数,一般是图片的地址。
     * 第二个Progerss:显示进度的类型。 第三个Result:执行完下载后返回的结果
     */

    class MyAsyncTask extends AsyncTask<String, Integer, byte[]> {
        private ProgressDialog dialog;

        // 在doInBackground中执行耗时任务
        @Override
        protected void onPreExecute() {
            dialog = new ProgressDialog(MainActivity.this);
            dialog.setTitle("下载进度");
            dialog.setMessage("Loading.......");
            dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            dialog.show();
        }

        @Override
        protected byte[] doInBackground(String... params) {
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            HttpURLConnection conn;
            URL url = null;
            int responseCode = 0;
            try {
                url = new URL(params[0]);
                conn = (HttpURLConnection) url.openConnection();// 打开网络

                conn.setDoInput(true);
                conn.setRequestMethod("GET"); // 获取方式为Get请求
                conn.connect();// 打开连接
                responseCode = conn.getResponseCode(); // 获取响应码

                // 如果响应码为200,说明相应成功
                if (responseCode == 200) {
                    long totalLength = conn.getContentLength();// 获取下载图片的总长度
                    int current = 0;// 获取当前下载图片的文件的长度
                    InputStream inputStream = null;// 获取流对象
                    inputStream = conn.getInputStream();
                    byte[] data = new byte[1024];// 获取流对象之后,创建一个字节数组
                    int temp = 0;
                    while ((temp = inputStream.read(data)) != -1) {
                        current += temp;// 将每次循环读取的内容添加到当前的变量中
                        int progress = (int) ((current / (float) totalLength) * 100);// 根据文件的总长度和当前进度获取图片的下载进度
                        publishProgress(progress);// 执行该方法 将进度发布到主线程中
                        stream.write(data, 0, temp);
                        stream.flush();
                    }
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (ProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return stream.toByteArray();// 将字节数组进行返回
        }

        @Override
        protected void onPostExecute(byte[] result) {
            if (result != null && result.length != 0) {// 说明执行成功
                // 将刚刚的字节流转换成图片对象
                Bitmap bitmap = BitmapFactory.decodeByteArray(result, 0,
                        result.length);
                iv.setImageBitmap(bitmap);
            } else {
                Toast.makeText(MainActivity.this, "图片下载失败", Toast.LENGTH_SHORT)
                        .show();// 说明图片下载失败
            }
            dialog.dismiss();// 将对话框消失,否则会一直出现
        }

        // 表示运行在主线程中更新进度的方法,如果在doInBackground方法中调用publishProgress方法向主线程中发布进度,由该方法获取进度之后更新ui
        @Override
        protected void onProgressUpdate(Integer... values) {
        //  Log.i("tag", Thread.currentThread().getName());// 由这个方法我们可以知道onProgressUpdate是运行在主线程中的
            dialog.setProgress(values[0]);// 设置进度
        }

    }
}

最后很重要的是要设置网络权限

<uses-permission android:name="android.permission.INTERNET" />

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值