AsyncTask源码解析

来源:互联网 发布:郑州软件定制 编辑:程序博客网 时间:2024/06/11 03:43

1、AsyncTask的原理

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

2、代码走向

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的构造函数

public FutureTask(Callable<V> callable) {        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的实现    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;        }




0 0
原创粉丝点击