AsyncTask的使用

2018-10-14  本文已影响0人  simit

AsyncTask是一种轻量级的异步任务类,是在线程池中执行后台任务,然后把任务的结果和任务执行的进度传递给主线程进行UI的更新。
AsyncTask的使用:

public class AsyncTaskTest extends AsyncTask<String,Integer,Bitmap> {

    private static final String TAG = "AsyncTaskTest";
    private ImageView imageView;
    private ProgressBar pb;
    public AsyncTaskTest(ImageView imageView, ProgressBar pb) {
        this.imageView = imageView;
        this.pb = pb;
    }
     //主线程中执行,异步任务执行之前调用
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }
    //主线程中执行,异步任务执行之后,返回值为异步任务的结果
    @Override
    protected void onPostExecute(Bitmap bitmap) {
        super.onPostExecute(bitmap);
        pb.setVisibility(View.GONE);
        imageView.setImageBitmap(bitmap);
    }
    //主线程中执行,异步任务执行的进度发生改变的时候调用
    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        //更新进度条
        Log.i(TAG,"onProgressUpdate  "+values[0]);
        pb.setProgress(values[0]);
    }
    //线程池中执行,用于执行异步任务,参数表示异步任务的请求参数,此方法中可调用                
    //publishProgress 更新进度,publishProgress 会调用onProgressUpdate
    @Override
    protected Bitmap doInBackground(String... strings) {

        for (int i = 0; i < 100; i++) {
            try {
                Thread.sleep(100);
                publishProgress(i);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        try {
            URLConnection URLConnection = new URL(strings[0]).openConnection();
            InputStream inputStream = URLConnection.getInputStream();
            BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
            Bitmap bitmap = BitmapFactory.decodeStream(bufferedInputStream);
            inputStream.close();
            bufferedInputStream.close();
            return bitmap;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}   

然后在主线程中实例AsyncTask并调用execute方法即可。
使用AsyncTask的注意事项:
1.AsyncTask的对象必须在主线程中创建并在主线程中调用execute方法。
2.不能手动调用onPreExcute,onPostExecute,doInBackground和onProgressUpdate方法。
3.AsyncTask的任务只能执行一次,否则会报运行时异常。
AsyncTask中有两个线程池,SerialExecutor 和 THREAD_POOL_EXECUTOR 还有一个Handler——InternalHandler,其中线程池SerialExecutor 用于任务的排队,而线程池THREAD_POOL_EX
ECUTOR 负责真正的执行任务,InternalHandler负责将执行环境从线程池切换到主线程。

上一篇下一篇

猜你喜欢

热点阅读