`
zhoujingheng
  • 浏览: 7370 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

AsyncTask原理详解

阅读更多

1.创建AsyncTask

new AsyncTask<String,String,String>(){

// 运行在主线程中,做预备工作

onPreExecute(){

 

}

// 运行在子线程中,做耗时操作

String doingBackGround(String s){

 

}

// 运行在主线程中,耗时操作完成,更新UI

onPostExecute(String s){

 

}

 

}.execute(String);

 

2.AsyncTask的execute方法

public final AsyncTask<Params, Progress, Result> execute(Params... params) {

       ...

 

       mStatus = Status.RUNNING;

// 在主线程中执行准备操作

       onPreExecute();

// 把params参数赋值给mWorker

       mWorker.mParams = params;

// 用线程池执行mFuture

       sExecutor.execute(mFuture);

 

// 在AsyncTask构造方法中创建了mWorker

   mWorker = new WorkerRunnable<Params, Result>() {

            public Result call() throws Exception {

               ...

            }

        };

 

        mFuture = new FutureTask<Result>(mWorker) {

            @Override

            protected void done() {

                ...

            }

        };

    }

// 把mWorker传递给FutureTask,callable指的就是mWorker

public FutureTask(Callable<V> callable) {

       if (callable == null)

           throw new NullPointerException();

       sync = new Sync(callable);

   }

// 把mWorker传递给Sync,callable指的是mWorker

Sync(Callable<V> callable) {

           this.callable = callable;

       }

 

3.线程池执行FutureTask,就是执行FutureTask的run方法,代码如下:

public void run() {

// 转调

       sync.innerRun();

   }

      

void innerRun() {

           if (!compareAndSetState(READY, RUNNING))

               return;

 

           runner = Thread.currentThread();

           if (getState() == RUNNING) { // recheck after setting thread

               V result;

               try {

// 就是调用了mWorker.call方法

// 把耗时操作得到的结果赋值给result

                   result = callable.call();

               } catch (Throwable ex) {

                   setException(ex);

                   return;

               }

// 转调了sync.innerSet(v);

               set(result);

           } else {

               releaseShared(0); // cancel

           }

       }

 

mWorker = new WorkerRunnable<Params, Result>() {

           public Result call() throws Exception {

               Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);

// 执行耗时操作 在子线程中执行

               return doInBackground(mParams);

           }

       };

 

protected void set(V v) {

// 转调

       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)) {

                   result = v;

                   releaseShared(0);

// 调用了FutureTask的抽象方法

                   done();

                   return;

               }

           }

       }

 

mFuture = new FutureTask<Result>(mWorker) {

            @Override

            protected void done() {

                Message message;

                Result result = null;

 

                try {

// 转调了sync.innerGet()

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

                }

// 发送了一个Message

                message = sHandler.obtainMessage(MESSAGE_POST_RESULT,

                        new AsyncTaskResult<Result>(AsyncTask.this, result));

                message.sendToTarget();

            }

        };

 

public V get() throws InterruptedException, ExecutionException {

// 转调

       return sync.innerGet();

   }

 

V innerGet() throws InterruptedException, ExecutionException {

           acquireSharedInterruptibly(0);

           if (getState() == CANCELLED)

               throw new CancellationException();

           if (exception != null)

               throw new ExecutionException(exception);

// 把之前doinBackground方法的结果返回

           return result;

}

 

3.在AsyncTask的成员变量,创建了InternalHandler

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

// 结束耗时操作完成后的消息

// 调用了AsyncTask的finish方法传递的result.mData[0]就是之前

// 耗时操作返回来的结果

                    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 static class AsyncTaskResult<Data> {

        final AsyncTask mTask;

        final Data[] mData;

// data 是返回的结果

        AsyncTaskResult(AsyncTask task, Data... data) {

            mTask = task;

            mData = data;

        }

    }

 

    private void finish(Result result) {

        if (isCancelled()) result = null;

// 耗时操作完成,更新UI,执行在主线程

        onPostExecute(result);

        mStatus = Status.FINISHED;

    }

分享到:
评论

相关推荐

    Android_AsyncTask_详解

    ### Android AsyncTask 详解 #### 一、AsyncTask 概述 `AsyncTask` 是 Android 提供的一个用于执行后台任务的轻量级框架。它能够帮助开发者轻松地在后台线程执行耗时的操作,并且更新 UI 界面而无需直接操作线程和...

    AsyncTask类实例详解

    下面我们将深入探讨AsyncTask的使用、原理以及如何更新UI。 首先,AsyncTask有三个泛型参数:`Param`, `Progress`, 和 `Result`。它们分别代表异步任务的输入参数类型、任务执行过程中的进度更新类型以及任务完成后...

    AsyncTask 详解

    本篇文章将详细解析AsyncTask的工作原理、使用方法及其优缺点。 首先,AsyncTask包含三个泛型参数:Params、Progress和Result。Params代表在execute()方法中传入的参数类型;Progress表示后台任务执行过程中的进度...

    android AsyncTask详细介绍

    **AsyncTask详解** AsyncTask是Android SDK提供的一种轻量级的异步处理机制,特别适合于执行短时间的、与UI相关的后台任务。它的主要优点在于简化了UI更新的过程,同时保持了代码的简洁。AsyncTask定义了三个泛型...

    android异步任务设计思详解(AsyncTask)

    Android中的异步任务设计主要体现在`AsyncTask`类上,它是Android SDK提供的一种方便快捷的多线程解决...理解`AsyncTask`的工作原理和注意事项,可以帮助开发者更高效地处理异步任务,提高应用程序的性能和用户体验。

    Android的异步任务AsyncTask详解

    在本文中,我们将深入探讨AsyncTask的原理、使用方法以及其限制。 AsyncTask的定义: 正如官方文档所述,AsyncTask是为了方便在UI线程和后台线程之间进行交互而设计的。它允许开发者在后台执行操作,并在完成后更新...

    腾讯Android社招面试源码相关11题+原理详解.zip

    【腾讯Android社招面试源码相关11题+原理详解】 在Android开发领域,源码理解和分析能力是面试中的一项重要考察点。这份文档“腾讯Android社招面试源码相关11题+原理详解”旨在帮助求职者准备面试,深入理解Android...

    android AsyncTask介绍

    #### 二、AsyncTask详解 ##### 2.1 AsyncTask 的作用 - `AsyncTask` 是 Android 为简化异步任务处理而设计的一个类。其主要目的是避免阻塞主线程(UI 线程),因为所有的 UI 更新都必须在主线程中完成。 - 通过 `...

    详解Android中AsyncTask机制

    下面我们将深入探讨AsyncTask的工作原理、使用方式以及相关知识点。 1. **AsyncTask的基本结构**: AsyncTask定义为一个抽象类,包含三个泛型参数:`Params`(输入参数)、`Progress`(执行进度)和`Result`(返回...

    AsyncTask的使用

    #### 二、AsyncTask的工作原理 `AsyncTask`主要通过以下四个步骤来实现异步任务的处理: 1. **onPreExecute()**:在主线程中调用,通常用于做一些UI初始化工作。 2. **doInBackground(Params... params)**:在子...

    Android系统原理与开发要点详解

    在Android系统原理与开发要点详解中,我们将会深入探讨Android操作系统的核心机制以及开发者在构建应用程序时需要关注的关键点。Android作为一个开源的移动操作系统,它的架构包括了多个层次,从底层的Linux内核到...

    异步任务类的使用

    本篇文章将深入探讨AsyncTask的原理、使用方法以及注意事项,旨在帮助开发者更好地理解和应用这一功能。 一、AsyncTask概述 AsyncTask是一个轻量级的框架,它允许在主线程之外执行后台操作,然后在UI线程中更新结果...

    Android系统原理及开发要点详解–1.pdf 高清下载

    - 多线程和异步处理:掌握在Android中使用Thread、Handler、AsyncTask等进行多线程编程和异步任务处理。 - 调试和性能优化:了解如何使用Logcat进行日志记录,以及如何使用Android Profiler等工具进行性能监控和分析...

    Android系统原理及开发要点详解课件

    本课件“Android系统原理及开发要点详解”由知名讲师韩超精心编排,旨在帮助开发者深入理解Android系统的底层机制,提升开发技能。 首先,我们要了解Android系统的架构。Android系统分为四个主要层次:Linux内核层...

    Android 系统原理与开发要点详解

    在Android系统原理与开发要点详解中,我们将会深入探讨Android这一全球最受欢迎的移动操作系统的核心机制以及开发者需要掌握的关键技能。Android系统是基于Linux内核的开源平台,它为应用程序提供了丰富的API接口,...

    Android系统原理与开发要点详解_培训课件.rar

    总的来说,这个"Android系统原理与开发要点详解"的培训课件涵盖了Android开发的多个关键领域,从基础概念到实践技巧,是初学者入门和进阶的宝贵资料。通过深入学习,开发者不仅能理解Android的运作机制,还能掌握...

    android系统原理及开发要点详解课件

    Android系统原理及开发要点详解课件是一份深入探讨Android操作系统及其开发实践的教育资源。这份资料旨在帮助学习者从系统层面理解Android,以便更好地进行应用程序开发。Android作为一个开源且功能强大的移动平台,...

Global site tag (gtag.js) - Google Analytics