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() {}
阅读全文
0 0
- AsyncTask 源码分析
- AsyncTask源码分析
- Android AsyncTask源码分析
- Android源码分析--AsyncTask
- 源码分析Android AsyncTask
- Android AsyncTask源码分析
- AsyncTask源码分析
- Android-AsyncTask源码分析
- 源码分析--AsyncTask
- AsyncTask源码分析
- AsyncTask源码分析
- AsyncTask源码分析
- AsyncTask源码分析
- Android AsyncTask 源码分析
- AsyncTask源码分析
- AsyncTask源码分析
- AsyncTask源码分析
- AsyncTask源码分析
- Sql server 权限管理
- centos 增加端口 修改防火墙
- day07-工作
- this和super
- 011-SDK框架之LYWSDKProtocolIOS.h
- AsyncTask 源码分析
- [ccf/csp题]201412-2 Z字形扫描
- STL空间配置器(一)
- PhotonServer学习
- 首发 | 北京踏歌智行完成Pre-A轮数千万融资,辰韬资本领投
- OpenCV坐标系与操作像素的四种方法
- TextView 和 EditText 的 DrawableRight 点击事件的处理
- "无限"弹出窗口的网址是如何实现的?
- 非负矩阵分解算法——Daniel D.Lee and H.Sebastian Seung论文翻译