Asynctask 代码分析
来源:互联网 发布:数据库怎么弄 编辑:程序博客网 时间:2024/06/06 05:26
学习Asynctask,首先是声明了一个ThreadFactory sThreadFactory ,其本质就是执行一个线程:
private static final ThreadFactory sThreadFactory = new ThreadFactory() { private final AtomicInteger mCount = new AtomicInteger(1); public Thread newThread(Runnable r) { return new Thread(r, "AsyncTask #" + mCount.getAndIncrement()); } };
这里的本质就是执行一个线程;下面创建一个容量为10的队列: private static final BlockingQueue<Runnable> sPoolWorkQueue = new LinkedBlockingQueue<Runnable>(10);下面是创建一个可以并行执行的线程池:/** * An {@link Executor} that can be used to execute tasks in parallel. */ public static final Executor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory);
需要说明一下里面的参数:
其中sThreadFactory就是上面定义的线程,当线程池里面的线程数量大于CORE_POOL_SIZE 而又小于 MAXIMUM_POOL_SIZE,并且sPoolWorkQueue并未填充满的时候,需要使用
sThreadFactory这个factory来新建一个线程;
下面是定义一个
public static final Executor SERIAL_EXECUTOR = new SerialExecutor();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); } }这个方法作用是将一个线程插入一个双向队列中,并去除下一个进行执行/** * Indicates the current status of the task. Each status will be set only once * during the lifetime of a task. */ public enum Status { /** * Indicates that the task has not been executed yet. */ PENDING, /** * Indicates that the task is running. */ RUNNING, /** * Indicates that {@link AsyncTask#onPostExecute} has finished. */ FINISHED, }这个是当前task的几种状态/** * Creates a new asynchronous task. This constructor must be invoked on the UI thread. */ public AsyncTask() { mWorker = new WorkerRunnable<Params, Result>() { public Result call() throws Exception { mTaskInvoked.set(true); Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); return postResult(doInBackground(mParams)); } }; mFuture = new FutureTask<Result>(mWorker) { @Override protected void done() { try { final Result result = get(); postResultIfNotInvoked(result); } catch (InterruptedException e) { android.util.Log.w(LOG_TAG, e); } catch (ExecutionException e) { throw new RuntimeException("An error occured while executing doInBackground()", e.getCause()); } catch (CancellationException e) { postResultIfNotInvoked(null); } catch (Throwable t) { throw new RuntimeException("An error occured while executing " + "doInBackground()", t); } } }; }上面的代码是初始化一个task,在里面需要初始化一个future,以后会通过这个future的get方法来获取一些运行以后的值;注意上面的标红的位置,这里就是doInBackground这个方法的执行位置; private void postResultIfNotInvoked(Result result) { final boolean wasTaskInvoked = mTaskInvoked.get(); if (!wasTaskInvoked) { postResult(result); } } private Result postResult(Result result) { Message message = sHandler.obtainMessage(MESSAGE_POST_RESULT, new AsyncTaskResult<Result>(this, result)); message.sendToTarget(); return result; }如果当前的task中没有将其invoke,就将这个task finish掉;下面的handler的定义: private static class InternalHandler extends Handler { @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 static abstract class WorkerRunnable<Params, Result> implements Callable<Result> { Params[] mParams; } @SuppressWarnings({"RawUseOfParameterizedType"}) private static class AsyncTaskResult<Data> { final AsyncTask mTask; final Data[] mData; AsyncTaskResult(AsyncTask task, Data... data) { mTask = task; mData = data; } }下面是task执行的过程: public final AsyncTask<Params, Progress, Result> execute(Params... params) { return executeOnExecutor(sDefaultExecutor, params); } public 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; }在executeOnExecutor中需要首先设置为status,然后执行onPreExecute,再然后执行exec.execute(mFuture);而这里的exec就是上面的sDefaultExecutor。
- Asynctask 代码分析
- Android AsyncTask代码分析
- AsyncTask 分析
- AsyncTask分析
- AsyncTask分析
- AsyncTask分析
- AsyncTask分析
- AsyncTask分析
- AsyncTask分析
- AsyncTask实现代码原理
- AsyncTask实现代码原理
- AsyncTask实现代码原理
- AsyncTask 代码赏析
- android *** AsyncTask 代码
- AsyncTask的代码
- Android AsyncTask深入分析
- Android AsyncTask 分析
- AsyncTask 源码分析
- pythonchallenge_1
- codeforces 126B Password DP KMP
- 关于sim/usim的一些概念
- JSTL API
- 微信版中文计算器
- Asynctask 代码分析
- Python ElementTree的find,findall函数参数
- 初探类的字段.属性.方法.事件
- JSTL与EL
- 8086的地址ffff:ffff和0:ffef回绕问题
- EDBC(Emacs-Lisp Database Connectivity)
- java 理解main方法&&代码块
- linux oos 声卡 驱动
- java 正则表达式的使用