AsyncTask 源码分析

来源:互联网 发布:淘宝封店支付宝还能用 编辑:程序博客网 时间:2024/06/05 15:43

原理:AsyncTask执行原理也比较简单,子线程执行,通过Handler机制回调到主线程,但是他的强大在于对线程的处理

一,AsyncTask 在一开始就搞了一个牛逼的功能,开启了一个线程池

static {    ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(            CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE_SECONDS, TimeUnit.SECONDS,            sPoolWorkQueue, sThreadFactory);    threadPoolExecutor.allowCoreThreadTimeOut(true);    THREAD_POOL_EXECUTOR = threadPoolExecutor;}
并获取了当前可用线程的数量

private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();

二,创建对象时,创建了两个对象

1.WorkerRunnable,用于线程执行结果的回调

2.FutureTask,用于对线程的控制

public AsyncTask() {    mWorker = new WorkerRunnable<Params, Result>() {        public Result call() throws Exception {            mTaskInvoked.set(true);            Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);            //noinspection unchecked            Result result = doInBackground(mParams);            Binder.flushPendingCommands();            return postResult(result);        }    };    mFuture = new FutureTask<Result>(mWorker) {        @Override        protected void done() {            try {                postResultIfNotInvoked(get());            } catch (InterruptedException e) {                android.util.Log.w(LOG_TAG, e);            } catch (ExecutionException e) {                throw new RuntimeException("An error occurred while executing doInBackground()",                        e.getCause());            } catch (CancellationException e) {                postResultIfNotInvoked(null);            }        }    };}

三,接下来就开始工作了,可以通过三个方法开始去执行

1.使用默认线程池,并保存参数

@MainThreadpublic final AsyncTask<Params, Progress, Result> execute(Params... params) {    return executeOnExecutor(sDefaultExecutor, params);}

2.可以指定线程池

@MainThreadpublic final AsyncTask<Params, Progress, Result> executeOnExecutor(Executor exec,        Params... params) {    if (mStatus != Status.PENDING) {        switch (mStatus) {            case RUNNING:                throw new IllegalStateException("Cannot execute task:"                        + " the task is already running.");            case FINISHED:                throw new IllegalStateException("Cannot execute task:"                        + " the task has already been executed "                        + "(a task can be executed only once)");        }    }    mStatus = Status.RUNNING;    onPreExecute();    mWorker.mParams = params;    exec.execute(mFuture);    return this;}

3.使用默认线程池,没有参数

@MainThreadpublic static void execute(Runnable runnable) {    sDefaultExecutor.execute(runnable);}


四,通过队列执行任务保证先后顺序

private static class SerialExecutor implements Executor {    final ArrayDeque<Runnable> mTasks = new ArrayDeque<Runnable>();    Runnable mActive;    public synchronized void execute(final Runnable r) {        mTasks.offer(new Runnable() {            public void run() {                try {                    r.run();                } finally {                    scheduleNext();                }            }        });        if (mActive == null) {            scheduleNext();        }    }    protected synchronized void scheduleNext() {        if ((mActive = mTasks.poll()) != null) {            THREAD_POOL_EXECUTOR.execute(mActive);        }    }}

五,主要介绍一个方法,用于取消进程,参数含义此次线程是否让其执行结束

public final boolean cancel(boolean mayInterruptIfRunning) {    mCancelled.set(true);    return mFuture.cancel(mayInterruptIfRunning);}

六,有的方法执行在主线程有的方法执行在子线程,其实他也使用了 Handler机制

private static class InternalHandler extends Handler {    public InternalHandler() {        super(Looper.getMainLooper());    }    @SuppressWarnings({"unchecked", "RawUseOfParameterizedType"})    @Override    public void handleMessage(Message msg) {        AsyncTaskResult<?> result = (AsyncTaskResult<?>) msg.obj;        switch (msg.what) {            case MESSAGE_POST_RESULT:                // There is only one result                result.mTask.finish(result.mData[0]);                break;            case MESSAGE_POST_PROGRESS:                result.mTask.onProgressUpdate(result.mData);                break;        }    }}


七,给调用者提供方法

以下是开发中常用的几个方法,具体使用和含义可以参考

http://blog.csdn.net/need_you_i_dream/article/details/78406060

@WorkerThreadprotected abstract Result doInBackground(Params... params);@MainThreadprotected void onPreExecute() {}@SuppressWarnings({"UnusedDeclaration"})@MainThreadprotected void onPostExecute(Result result) {}@SuppressWarnings({"UnusedDeclaration"})@MainThreadprotected void onProgressUpdate(Progress... values) {}@SuppressWarnings({"UnusedParameters"})@MainThreadprotected void onCancelled(Result result) {    onCancelled();}    @MainThreadprotected void onCancelled() {}






原创粉丝点击