Android 多线程之AsyncTack的简单使用

一、什么是AsyncTask

本质上就是一个封装了线程池和handler的异步框架,主要是用来执行异步任务的,由于内部集成了Handler,可以很灵活在主线程与工作线程(子线程)间切换,将后台任务执行的结果,返回到UI线程处理并更新UI界面。

二、AsyncTask的使用方法

 /**
     *
     * public abstract class AsyncTask<Params, Progress, Result>
     * AsyncTask是个泛型类,有三个泛型参数
     * Params:参数的类型
     * Progress:后台任务执行的进度的类型
     * Result:后台任务执行的最终结果值
     *
     */
    @SuppressLint("StaticFieldLeak")
    private class DownloadAsyncTask extends AsyncTask<Integer,Integer,String>{


        /**
         * 在主线程中执行,在异步任务执行之前调用,一般是用来做一些准备工作
         */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            Log.d(TAG, "onPreExecute: ");
        }

        /**
         *在线程池中执行,用于后台执行异步任务
         * @param integers
         * @return 返回的结果将发送onPostExecute方法中
         */
        @Override
        protected String doInBackground(Integer... integers) {

            String text="";
            for (int i = 0; i <=5 ; i++) {
                text=Integer.toString(i);
                /*当需要更新进度条,调用publishProgress方法会onProgressUpdate方法
                * 原理是通过Handler发送消息,当接受了对应的消息并会调用onProgressUpdate方法。
                * */
                publishProgress(i);
                Log.d(TAG, "doInBackground: "+i);
                try {
                    //模拟网络加载
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return text;
        }

        /**
         * 在主线程中运行,当后台任务执行结果有变化会调用此方法,前提在doInBackground方法必须调用了
         * publishProgress方法才会执行。
         */
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            Log.d(TAG, "onProgressUpdate: "+values[0]);
        }

        /**
         * 在主线程中运行,当异步任务执行结束后,会调用此方法,并把doInBackground最终值返回给
         * onPostExecute中
         */
        @Override
        protected void onPostExecute(String aLong) {
            super.onPostExecute(aLong);
            Log.d(TAG, "onPostExecute: "+aLong);
        }
    }

以上代码调用new DownloadAsyncTask().execute(),输出的结果如下:

03-08 15:26:42.164 2386-2386/com.pos.handler D/HandlerActivity: onPreExecute: 
03-08 15:26:42.173 2386-2413/com.pos.handler D/HandlerActivity: doInBackground: 0
03-08 15:26:42.187 2386-2386/com.pos.handler D/HandlerActivity: onProgressUpdate: 0
03-08 15:26:42.265 2386-2413/com.pos.handler D/HandlerActivity: doInBackground: 1
03-08 15:26:42.266 2386-2386/com.pos.handler D/HandlerActivity: onProgressUpdate: 1
03-08 15:26:42.357 2386-2413/com.pos.handler D/HandlerActivity: doInBackground: 2
03-08 15:26:42.358 2386-2386/com.pos.handler D/HandlerActivity: onProgressUpdate: 2
03-08 15:26:42.446 2386-2413/com.pos.handler D/HandlerActivity: doInBackground: 3
03-08 15:26:42.447 2386-2386/com.pos.handler D/HandlerActivity: onProgressUpdate: 3
03-08 15:26:42.533 2386-2413/com.pos.handler D/HandlerActivity: doInBackground: 4
03-08 15:26:42.546 2386-2386/com.pos.handler D/HandlerActivity: onProgressUpdate: 4
03-08 15:26:42.623 2386-2413/com.pos.handler D/HandlerActivity: doInBackground: 5
03-08 15:26:42.624 2386-2386/com.pos.handler D/HandlerActivity: onProgressUpdate: 5
03-08 15:26:42.714 2386-2386/com.pos.handler D/HandlerActivity: onPostExecute: 5

三、AsyncTask的机制原理

  1. AsyncTask的本质是一个静态的线程池,asycnTask派生出的子类可以实现不同的异步任务,这些任务都是提交到静态的线程池中执行
  2. 线程池中的工作线程(子线程)执行doInBackground方法执行异步任务
  3. 当任务状态发生改变之后,工作线程会向UI线程发送消息,AsyncTask内部的Handler会响应这些消息,并调用相关的回调函数。

猜你喜欢

转载自blog.csdn.net/hzw2017/article/details/79490743