AsyncTask原理
来源:互联网 发布:男女唱的网络红歌 编辑:程序博客网 时间:2024/06/15 22:53
new AsyncTask<String, String, String>() { // 2. 运行在主线程中, 做一些准备操作. public void onPreExecute() { } // 3. 运行在子线程中, 做一些耗时的任务. public String doInBackground(String... params) { return null; } // 4. 运行主线程中, result就是doInBackground方法返回的值. 做一些收尾操作. public void onPostExecute(String result) { }}.execute(String... params); // 1. 开始执行异步任务.
AsyncTask的execute的方法, 代码如下:
public final AsyncTask<Params, Progress, Result> execute(Params... params) { ... mStatus = Status.RUNNING; // 调用用户的实现方法, 让用户做一些准备操作. 运行在主线程中. onPreExecute(); // 把mWorker中的mParams赋值为用户传递进来的参数. mWorker.mParams = params; // 使用线程池, 执行任务. 这时进入到子线程中. sExecutor.execute(mFuture); return this;}
查看mWorker的初始化过程, 代码如下:
// AsyncTask构造函数在一开始使用异步任务时, 已经调用.public AsyncTask() { mWorker = new WorkerRunnable<Params, Result>() { public Result call() throws Exception { ... } }; // 1. 把mWorker对象传递给了FutureTask的构造函数 mFuture = new FutureTask<Result>(mWorker) { @Override protected void done() { ... } };}// FutureTask类中接收的是Callable的类型, 其实WorkerRunnable类型实现了Callable的类型.public FutureTask(Callable<V> callable) { if (callable == null) throw new NullPointerException(); // 2. 把callable(mWorker)传递给了Sync的构造函数. sync = new Sync(callable);}Sync(Callable<V> callable) { // 3. 把接收过来的callable(mWorker)对象赋值给Sync类中的成员变量callable // 总结: Sync类中的成员变量callable就是AsyncTask中的mWorker对象. this.callable = callable;}
mFuture对象中的run方法如下:
public void run() { // 1. 调用了innerRun方法. sync.innerRun();}void innerRun() { if (!compareAndSetState(READY, RUNNING)) return; runner = Thread.currentThread(); if (getState() == RUNNING) { // recheck after setting thread V result; try { // 2. 调用了callable(mWorker)的call方法. 获取一个返回结果. result = callable.call(); } catch (Throwable ex) { setException(ex); return; } // 4. 把结果传递给set方法. set(result); } else { releaseShared(0); // cancel }}// 在AsyncTask的构造函数中, mWorker对象初始化时, 已经覆盖了call方法, 代码如下public Result call() throws Exception { Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); // 3. 调用了用户实现的doInBackground方法, 去执行一个耗时的任务. 运行在子线程中. // doInBackground接收的参数就是execute方法接收的参数. return doInBackground(mParams); }
protected void set(V v) { // 5. 继续把参数传递给innerSet方法. sync.innerSet(v);}void innerSet(V v) { for (;;) { int s = getState(); if (s == RAN) return; if (s == CANCELLED) { // aggressively release to set runner to null, // in case we are racing with a cancel request // that will try to interrupt runner releaseShared(0); return; } if (compareAndSetState(s, RAN)) { // 6. 把doInBackground返回的结果赋值给成员变量result result = v; releaseShared(0); // 7. 调用FutureTask中的done方法. done(); return; } }}
// 此方法定义在AsyncTask的构造函数中, 初始化mFuture时,已经覆盖了done方法, 代码如下:@Overrideprotected void done() { Message message; Result result = null; try { // 8. 调用FutureTask中的get方法获取result(doInBackground返回的结果). result = get(); } 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) { message = sHandler.obtainMessage(MESSAGE_POST_CANCEL, new AsyncTaskResult<Result>(AsyncTask.this, (Result[]) null)); message.sendToTarget(); return; } catch (Throwable t) { throw new RuntimeException("An error occured while executing " + "doInBackground()", t); } // 11. 创建一个消息对象. // msg.what = MESSAGE_POST_RESULT; // msg.obj = new AsyncTaskResult<Result>(AsyncTask.this, result); message = sHandler.obtainMessage(MESSAGE_POST_RESULT, new AsyncTaskResult<Result>(AsyncTask.this, result)); // 12. 把当前消息使用sHandler发送出去. message.sendToTarget();}public V get() throws InterruptedException, ExecutionException { // 9. 转调innerGet方法. return sync.innerGet();}V innerGet() throws InterruptedException, ExecutionException { ... // 10. 把result(doInBackground的结果)返回回去. result成员变量是在innerSet方法中赋值. 详情看第6步. return result;}
private static class InternalHandler extends Handler { @SuppressWarnings({"unchecked", "RawUseOfParameterizedType"}) @Override public void handleMessage(Message msg) { // 把obj转换成AsyncTaskResult类, 这个类中mTask对象就是当前的AsyncTask对象. mData对象就是doInBackground的返回结果. AsyncTaskResult result = (AsyncTaskResult) msg.obj; switch (msg.what) { case MESSAGE_POST_RESULT: // There is only one result // 13. 调用AsyncTask中的finish方法, 并且把doInBackground的返回结果传递进去. 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; } }}private void finish(Result result) { if (isCancelled()) result = null; // 14. 把doInBackground的返回结果传递给用户实现的onPostExecute方法. 运行在主线程中, 用户可以做一些操作界面, 更新界面的操作. onPostExecute(result); mStatus = Status.FINISHED;}
0 0
- AsyncTask原理
- AsyncTask原理
- Asynctask原理
- AsyncTask原理
- AsyncTask原理
- AsyncTask原理
- AsyncTask原理
- AsyncTask 原理
- AsyncTask原理
- AsyncTask原理
- AsyncTask原理
- AsyncTask原理
- Asynctask 原理
- AsyncTask 原理
- AsyncTask原理浅见
- AsyncTask实现代码原理
- AsyncTask实现代码原理
- AsyncTask的实现原理
- Android 工具类的两种写法---单例模式与静态方法
- 在OpenStack中创建网络
- nullptr模拟实现
- 蒙特卡罗方法入门
- 大数加法
- AsyncTask原理
- arcpy输入arcmap视图
- 文件分隔符和转义字符
- vue-cli+webpack实现多页面应用的配置
- java的动态绑定--core java读书笔记
- 遗传算法
- 搜索曝光-竞品对比
- Android音视频点/直播模块开发实践总结
- JVM内存结构