AsyncTask源码解析
2015-10-19 22:00
453 查看
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; }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories