AsyncTask的用法

android.os.AsyncTask<Params,Progress,Result>

为什么会有AsyncTask类

  1、为了解决主线程中的耗时操作,防止主线程出现ANR。
  完整类名:android.os.AsyncTask<Params, Progress, Result>
  是一个抽象类,通常被继承。
  Params:任务执行时,所需要的参数
  Progress:后台任务执行时返回的进度值

  Result:后台任务执行完成后,返回的结果值

 构建AsyncTask子类的回调方法

  doInBackground:必须重写,异步执行后台线程将要完成的任务
  onPreExecute:执行后台耗时操作前被调用,通常用户完成一些初始化操作
  onPostExecute: 当doInBackground()完成后,系统会自动调用
  onProgressUpdate: 在doInBackground()方法中调用publishProgress()方法中调用publishProgress
  更新任务的执行进度后,就会触发该方法。

 AsyncTask的执行顺序:

  onPreExecute--->doInBackground(调用publishProgress方法后)--->onProgressUpdate--->onPostExecute

  在主线程中创建AsyncTask<Params,Progress,Result>的子类,调用execute方法。

例子:通过AsyncTask异步加载网络图片

MainActivity.java

package lzl.edu.com.asynctaskdemo;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class MainActivity extends Activity {

    private ImageView mImage;
    private Button mBtn_getImage;
    private ProgressBar mPb;
    public static final String IMAGE_URL =
            "http://img.firefoxchina.cn/2015/10/5/201510221522590.jpg";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mImage = (ImageView)findViewById(R.id.myImage);
        mBtn_getImage = (Button)findViewById(R.id.btn_getImage);
        mPb = (ProgressBar)findViewById(R.id.pb);
        mBtn_getImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new getImageAsyncTask().execute(IMAGE_URL);
            }
        });
        //定义一个一步操作的实现类,在非主线程中进行一些耗时的操作
    }
    //定义一个异步任务,来完成网络图片的获取。并且显示加载图片的进度条。
    class getImageAsyncTask extends AsyncTask<String,Void,Bitmap>{

        //用户点击访问图片之后,显示进度条
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            mPb.setVisibility(View.VISIBLE);
        }

        @Override
        protected Bitmap doInBackground(String... params) {
            Bitmap bitmap = null;
            try {
                //模拟耗时工作
                Thread.sleep(5000);
                //将String类型的地址,转换成URL路径
                Log.i("comde",params[0]);
                URL url = new URL(params[0]);
                HttpURLConnection connection =(HttpURLConnection)url.openConnection();
                //设置超时时间
                connection.setReadTimeout(5000);
                Log.i("comde",""+connection.getResponseCode());
                //如果访问码==200表示访问成功
                if(connection.getResponseCode() == 200){
                    InputStream is = connection.getInputStream();
                    //将获取的输入流,转换成Bitmap对象
                     bitmap = BitmapFactory.decodeStream(is);
                }
            }catch (Exception e){
                e.printStackTrace();
            }
            return bitmap;
        }
        //返回结果是图片,并让进度条消失
        @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);
            //让进度条消失
            mPb.setVisibility(View.GONE);
            //让图片显示
            mImage.setVisibility(View.VISIBLE);
            mImage.setImageBitmap(bitmap);
        }
    }
}

ProgressBarActivity.java

package lzl.edu.com.asynctaskdemo;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.ProgressBar;

public class ProgressBarActivity extends Activity {

    android.widget.ProgressBar mPb_pb;
    MyAsyncTask mTask;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_progress_bar);
        mPb_pb = (ProgressBar)findViewById(R.id.pb_pb);
        mTask = new MyAsyncTask();
        mTask.execute();
    }

    @Override
    protected void onPause() {
        super.onPause();
        //当activity停止时,判断异步任务是否正在运行。如果正在运行,设置成cancel。然后在异步任务操作时调用
        if(mTask!=null&&mTask.getStatus() == AsyncTask.Status.RUNNING){
            mTask.cancel(true);
        }
    }

    class MyAsyncTask extends AsyncTask<Void,Integer,Void>{

        @Override
        protected Void doInBackground(Void... params) {
                try{
                    for(int i=0;i<100;i++){
                        //每次进行异步操作时,判断该任务是否被取消。
                        if(isCancelled()){
                            break;
                        }
                        Thread.sleep(30);
                        publishProgress(i);
                    }
                }catch (Exception e){
                    e.printStackTrace();
                }
        return null;
        }
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            Log.i("values",values[0]+"");
            mPb_pb.setProgress(values[0]);
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值