AsyncTask原理分析

AsyncTask原理

InternalHandler handler
ThreadPool pool 线程池

AsyncTask的默认构造函数如下:
   public AsyncTask() {
        //实例化mWorker WorkerRunnable的代码看1步
        //mWorker 是 Callable类型
        mWorker = new WorkerRunnable<Params, Result>() {
            public Result call() throws Exception {
                。。。
            }
        };


        // Future
        mFuture = new FutureTask<Result>(mWorker) {
            @Override
            protected void done() {
               。。。
            }
        };
    }
    //1步
     private static abstract class WorkerRunnable<Params, Result> implements Callable<Result> {
        Params[] mParams;
    }

### AsyncTask的 execute方法
    public final AsyncTask<Params, Progress, Result> execute(Params... params) {


        mStatus = Status.RUNNING; .
        //主线中调用onPreExecute
        onPreExecute();

        //mWorker Callable类型,把execute方法参数赋值给mWorker对象

        mWorker.mParams = params;
        // sExecutor 线程池
        //mFuture
        sExecutor.execute(mFuture);

        return this;
    }
FutureTask的构造函数
        if (callable == null)
            throw new NullPointerException();
        //callable 就是 mWorker
        sync = new Sync(callable);
    }
Sync类的Callable参数构造函数:
    //callable 还是 mWorker
    Sync(Callable<V> callable) {
            this.callable = callable;
    }
FutureTask的run方法
public void run() {
        sync.innerRun();
    }
Sync类的innerRun方法
     void innerRun() {
             。。。。
                V result;
                try {
                   //子线程的执行结果
                    //1.mWorker.call
                    result = callable.call();//mworker
                } catch (Throwable ex) {
                    setException(ex);
                    return;
                }
                //3.处理result.内部内访问外部类的方法
                set(result);
            } else {
                releaseShared(0); // cancel
            }
        }
        // 1. mWorker的 call方法
         public Result call() throws Exception {
                Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
                //2.子线程执行
                return doInBackground(mParams);
         }

       //4.set(result)保存result,FutureTask类的set方法:
       protected void set(V v) {
          //5. Sync里innerSet方法保存result
          sync.innerSet(v);
      }


      //6.
        //v  就是result
        void innerSet(V v) {
            for (;;) {
                ...
                    result = v;
                    //7. done
                    done();
                    return;

            }
      //8.done方法  在AsyncTask的构造函数中覆盖该方法,代码:
      @Override
            protected void done() {
                Message message;
                Result result = null;

                try {
                   //9.get()
                    result = get();
                }... 
                // 10到12看下面 13.获取Message
                message = sHandler.obtainMessage(MESSAGE_POST_RESULT,
                        new AsyncTaskResult<Result>(AsyncTask.this, result));
                message.sendToTarget();
            }
        };
    //14.InternalHandler的实现(sHandler是其实例)
    private static class InternalHandler extends Handler {
        @SuppressWarnings({"unchecked", "RawUseOfParameterizedType"})
        //15.
        @Override
        public void handleMessage(Message msg) {
            AsyncTaskResult result = (AsyncTaskResult) msg.obj;
            switch (msg.what) {
                case MESSAGE_POST_RESULT:
                    // There is only one result
                    //16.
                    result.mTask.finish(result.mData[0]);
                    break;
                case MESSAGE_POST_PROGRESS:
                    result.mTask.onProgressUpdate(result.mData);
                    break;
                case MESSAGE_POST_CANCEL:
                    result.mTask.onCancelled();
                    break;
            }
        }
    }
    // 17.
      @SuppressWarnings({"RawUseOfParameterizedType"})
    private static class AsyncTaskResult<Data> {
        final AsyncTask mTask;
        final Data[] mData;

        AsyncTaskResult(AsyncTask task, Data... data) {
            mTask = task;
            mData = data;
        }
    }
    // 18. AsyncTask类的finish()方法
    private void finish(Result result) {
        if (isCancelled()) result = null;
        // 调用处理result,主线程
        onPostExecute(result);
        mStatus = Status.FINISHED;
    }
    //10.调用get()取结果
    public V get() throws InterruptedException, ExecutionException {
        //11.调用sync的innerGet方法
        return sync.innerGet();
    }
    //12.sync.innerGet()
     V innerGet() throws InterruptedException, ExecutionException {
            //返回result,赋值的代码看6步
            return result;
        }
AsyncTask的原理:

1.
onPreExecute();在主线程中执行,在doInbackground方法之前
2.
result = doInbackground();在线程池中执行(子线程)
3,
onPostExecute();处理result,在主线程中执行(handler机制)

说白了,绕来绕去就只有三个方法,下面根据核心来写个Demo帮助理解:
MyAsyncTask

package com.itheima.asynctaskdemo;

import android.os.Handler;
import android.os.Message;

public abstract class MyAsyncTask {
    private Handler handler = new Handler(){
        public void handleMessage(android.os.Message msg) {
            onPostExecute((String)msg.obj);
        };
    };
    //执行之前初始化,在主线程中执行
    public abstract void onPreExecute();

    //在子线程中执行
    public abstract String doInBackground(String... params);

    //在主线程中执行,处理结果doInBackground的返回结果
    public abstract void onPostExecute(String res);


    public void execute(final String... params){
        //主线程
        onPreExecute();

        new Thread(){
            public void run(){
                //在子线程中执行
                String res = doInBackground(params);
                //在主线程中执行

                Message msg = handler.obtainMessage();
                msg.obj = res;
                msg.sendToTarget();
            }
        }.start();
    }
}

测试类

package com.itheima.asynctaskdemo;

import android.app.Activity;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.Menu;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        new MyAsyncTask() {

            @Override
            public void onPreExecute() {
                System.out.println(Thread.currentThread().getName() + ": onPreExecute");
            }

            @Override
            public void onPostExecute(String res) {
                System.out.println(Thread.currentThread().getName() + ": onPostExecute" + res);
            }

            @Override
            public String doInBackground(String... params) {
                System.out.println(Thread.currentThread().getName() + ": doInBackground");
                SystemClock.sleep(2000);
                return "去死";
            }
        }.execute("账上","没有","钱");
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值