【十三】Android AsyncTask

AsyncTask知识复习

  1. 异步加载原因

    A、Android单线程模型
    B、耗时操作阻塞UI线程

  2. 异步加载常见方式

    A、多线程\线程池
    B、AsyncTask

  3. AsyncTask类解释

    class A extends AsyncTask<Params, Progress, Result>
    

    Params 任务开始输入的数据类型,一般为String(URL)地址哦。
    Progress任务执行进度的类型哦,一般可以是Integer
    Result任务执行后返回的数据类型,一般不知道,看自己定义的。

  4. AsyncTask需要重写的方法

这里写图片描述
5.
这里写图片描述

package com.example.asynctask_download;

import java.io.IOException;

import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.DefaultClientConnection;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends Activity {
    private String url = "http://h.hiphotos.baidu.com/image/pic/item/2e2eb9389b504fc2022d2904e7dde71190ef6d45.jpg";
    private Button bt;
    private ImageView iView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bt = (Button) findViewById(R.id.bt);
        iView = (ImageView) findViewById(R.id.imageView1);
        bt.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                //
                HttpClient httpClient = (HttpClient) new DefaultHttpClient();
                HttpGet httpGet = new HttpGet(url);
                try {
                    httpClient.execute(httpGet);
                } catch (ClientProtocolException e) {
                    //
                    e.printStackTrace();
                } catch (IOException e) {
                    //
                    e.printStackTrace();
                }
            }
        });

    }

}

当我们之间记载图片是会报出这样的错误,Android3.0后不能在UI线程中执行网络操作,否则报一下错误
这里写图片描述



> 这里是带进度条的异步图片加载方法

package com.example.asynctask_download;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.DefaultClientConnection;
import org.apache.http.util.EntityUtils;

import android.R.integer;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Entity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;

public class MainActivity extends Activity {
    private String url = "http://h.hiphotos.baidu.com/image/pic/item/2e2eb9389b504fc2022d2904e7dde71190ef6d45.jpg";
    private Button bt;

    /**
     * 变量或对象的描述
     * 
     * @Fields iView : 相框
     * @type
     */
    private ImageView iView;

    /**
     * 变量或对象的描述
     * 
     * @Fields bitmap : 图片
     * @type
     */
    private Bitmap bitmap;

    /**
     * 变量或对象的描述
     * 
     * @Fields progressDialog : 进度条
     * @type
     */
    private ProgressDialog progressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bt = (Button) findViewById(R.id.bt);
        iView = (ImageView) findViewById(R.id.imageView1);
        progressDialog = new ProgressDialog(this);
        progressDialog.setTitle("提示信息");
        progressDialog.setMessage("正在执行,请稍等");
        progressDialog.setProgressStyle(progressDialog.STYLE_HORIZONTAL);
        progressDialog.setCancelable(false);
        bt.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // 执行异步任务的操作
                new MyAsyncTask().execute(url);

            }

        });

    }

    class MyAsyncTask extends AsyncTask<String, Integer, Bitmap> {

        /**
         * @Title:【重写】 doInBackground
         * @Description:耗时操作执行类
         * @param params
         * @return
         */
        @Override
        protected Bitmap doInBackground(String... params) {
            Bitmap bitmap = null;
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();// 创建一个输出流
            InputStream inputStream_nadao = null;// 创建一个输入流用于拿到数据
            // 使用网络链接类HttpClient类完成对网络数据的提取
            HttpClient httpClient = (HttpClient) new DefaultHttpClient();
            // 获取链接方式
            HttpGet httpGet = new HttpGet(params[0]);
            try {
                HttpResponse httpResponse = httpClient.execute(httpGet);
                if (httpResponse.getStatusLine().getStatusCode() == 200) {
                    inputStream_nadao = httpResponse.getEntity().getContent();

                    // 获取文件的一个总长度
                    long file_length = httpResponse.getEntity()
                            .getContentLength();
                    // 起始长度
                    int len = 0;
                    byte[] data = new byte[1024];
                    // 总长度
                    int total_length = 0;
                    while ((len = inputStream_nadao.read(data)) != -1) {
                        total_length += len;
                        int values = (int) (((total_length / (float) len) * 100));
                        publishProgress(values);
                        // 将图片放到outputStream中,他可以转换成字节数组
                        outputStream.write(data, 0, len);
                    }
                    // 创建一个字节数组
                    byte[] result = outputStream.toByteArray();
                    bitmap = BitmapFactory.decodeByteArray(result, 0,
                            result.length);

                }
            } catch (ClientProtocolException e) {
                //
                e.printStackTrace();
            } catch (IOException e) {
                //
                e.printStackTrace();
            } finally {
                if (inputStream_nadao != null) {
                    try {
                        inputStream_nadao.close();
                    } catch (IOException e) {
                        //
                        e.printStackTrace();
                    }

                }
            }

            return bitmap;

        }

        /**
         * @Title:【重写】 onPreExecute
         * @Description: 表示任务执行前的操作
         */
        @Override
        protected void onPreExecute() {
            //
            super.onPreExecute();
            progressDialog.show();

        }

        /**
         * @Title:【重写】 onProgressUpdate
         * @Description:这里是执行进度的方法
         * @param values
         */
        @Override
        protected void onProgressUpdate(Integer... values) {
            //
            super.onProgressUpdate(values);
            progressDialog.setProgress(values[0]);

        }

        /**
         * @Title:【重写】 onPostExecute
         * @Description:负责更新UI
         * @param result
         */
        @Override
        protected void onPostExecute(Bitmap result) {
            //

            super.onPostExecute(result);
            iView.setImageBitmap(result);
            progressDialog.dismiss();

        }

    }

}

这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值