AsyncTask的用法

来源:互联网 发布:使用sci hub 知乎 编辑:程序博客网 时间:2024/06/11 03:50

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]);        }    }}


0 0