美文网首页
第十一章 Android的线程和线程池

第十一章 Android的线程和线程池

作者: 橙子6193 | 来源:发表于2022-02-26 21:14 被阅读0次

11.2、AsyncTask的工作原理

执行AsyncTask的execute方法,会执行executeOnExecutor方法,该方法第一个参数是线程池,第二个是传给AsyncTask的参数

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

在该方法里,首先会调用onPreExecute方法,然后将传进来的参数赋值给mWorker.params,再调用第一个参数线程池的execute方法,传入mFuture

onPreExecute();
mWorker.mParams = params;
exec.execute(mFuture);

如果是AsyncTask的默认线程池SerialExecutor,则只是用于排队,使AsyncTask提交的任务一个一个的执行。最终执行是放在THREAD_POOL_EXECUTER线程池中执行的

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);
            }
        }
    }

执行mFuture的run方法,最终调用mWorker对象的call方法,在call方法里,会执行doInBackground方法,返回一个Result对象,传入postResult方法里

mWorker = new WorkerRunnable<Params, Result>() {
            public Result call() throws Exception {
                mTaskInvoked.set(true);
                Result result = null;
                try {
                    Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
                    //noinspection unchecked
                    result = doInBackground(mParams);
                    Binder.flushPendingCommands();
                } catch (Throwable tr) {
                    mCancelled.set(true);
                    throw tr;
                } finally {
                    postResult(result);
                }
                return result;
            }
        };

在postResult方法里,会利用sHandler即主线程的handler把Result发送到主线程进行处理,在handler的handMessage方法中,会调用onPostExecute方法,将结果发送到主线程

private static class InternalHandler extends Handler {
        public InternalHandler(Looper looper) {
            super(looper);
        }

        @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;
            }
        }
    }
 private void finish(Result result) {
        if (isCancelled()) {
            onCancelled(result);
        } else {
            onPostExecute(result);
        }
        mStatus = Status.FINISHED;
    }

如果需要更新进度,可在doInBackground方法里调publishProgress方法,传入进度信息,publishProgress方法里就会通过sHandler把进度信息传到主线程

protected final void publishProgress(Progress... values) {
        if (!isCancelled()) {
            getHandler().obtainMessage(MESSAGE_POST_PROGRESS,
                    new AsyncTaskResult<Progress>(this, values)).sendToTarget();
        }
    }

相关文章

网友评论

      本文标题:第十一章 Android的线程和线程池

      本文链接:https://www.haomeiwen.com/subject/yoqcrrtx.html