`
hotpro
  • 浏览: 21527 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
文章分类
社区版块
存档分类
最新评论

Android AsyncTask Essentials

阅读更多
Essentials系列主要是讲原理和实现,应用可以参考API说明和APIDemo
AsyncTask是android自带的,用于异步调用的一个东西。
别人的轮子
上原版说明。
AsyncTask enables proper and easy use of the UI thread. This class allows to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers.

An asynchronous task is defined by a computation that runs on a background thread and whose result is published on the UI thread. An asynchronous task is defined by 3 generic types, called Params, Progress and Result, and 4 steps, called begin, doInBackground, processProgress and end.

原版说明写的蛮好的,3 types, 4 steps.
这里我就不具体说明了,看看Reference就好了。
这里主要还是介绍多线程的应用

Android上面的确有很多需要用到多线程的地方。这个东西很好用。

下面就研究源码
主要先看几个成员变量

    /**  一个BlockingQueue,给ThreadPoolExecutor存Task用的。 */
    private static final BlockingQueue<Runnable> sWorkQueue =
            new LinkedBlockingQueue<Runnable>(10);
  
    /**  一个ThreadFactory,也是给ThreadPoolExecutor用的,计数功能,标识Thread id功能。 */
    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());
        }
    };
  
    /** ThreadPool*/
    private static final ThreadPoolExecutor sExecutor = new ThreadPoolExecutor(CORE_POOL_SIZE,
            MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, sWorkQueue, sThreadFactory);

    /** callable, 用于返回thread执行的结果 */
    private final WorkerRunnable<Params, Result> mWorker;
   
    //future 和task的混合体。construct method可以传入callable.
   // 可以用于获得thread执行结果,cancel thread.
    private final FutureTask<Result> mFuture;

constructor
initialize mWorker, mFuture.

execute()
        onPreExecute();  // run in UI thread

        mWorker.mParams = params;
        sExecutor.execute(mFuture);

then invoke
call() in mWorker = new ...
        mWorker = new WorkerRunnable<Params, Result>() {
            public Result call() throws Exception {
                Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
                return doInBackground(mParams);   // run in new thread
            }
        };


then invoke
done() in mFuture = new ...
        mFuture = new FutureTask<Result>(mWorker) {
            @Override
            protected void done() {
                Message message;
                Result result = null;

                try {
                    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 = sHandler.obtainMessage(MESSAGE_POST_RESULT,
                        new AsyncTaskResult<Result>(AsyncTask.this, result));
                message.sendToTarget();
            }
        };


Let us look up inner class 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
                    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;
        onPostExecute(result);
        mStatus = Status.FINISHED;
    }

再看
    protected final void publishProgress(Progress... values) {
        sHandler.obtainMessage(MESSAGE_POST_PROGRESS,
                new AsyncTaskResult<Progress>(this, values)).sendToTarget();
    }

至此4 steps都看完了。

AsyncTask让你很安全的管理线程。

执行任务,取消任务,实时更新progress, 获得任务执行结果。

别人的轮子,可以拿来用。


看了下,

    private static final ThreadPoolExecutor sExecutor = new ThreadPoolExecutor(CORE_POOL_SIZE,

            MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, sWorkQueue, sThreadFactory);

AsyncTask里面的thread pool是static的。

这就是说用AsyncTask,一个APP里面正能同时跑5个thread.另外新启动的要在后面排队。
分享到:
评论

相关推荐

    Android AsyncTask用法和异步加载图片.rar

    Android提供了一种轻量级的机制来在后台执行这些任务,即`AsyncTask`。本资料包主要讲解了如何使用`AsyncTask`进行异步加载图片,这对于在UI线程中保持流畅用户体验至关重要。 `AsyncTask`是Android SDK中的一个类...

    Android AsyncTask 源码解析

    **Android AsyncTask 源码解析** AsyncTask 是 Android 平台上一个非常重要的工具类,用于在后台线程执行耗时操作,然后在 UI 线程更新结果,从而避免了因长时间运行任务而导致的 ANR(Application Not Responding...

    Android AsyncTask Demo 自己参考网络写的学习 demo

    在Android开发中,AsyncTask是一种常用的工具类,用于在后台线程执行耗时操作,同时在UI线程更新进度或结果。这个“Android AsyncTask Demo”是开发者为了学习和理解AsyncTask工作原理而编写的示例代码。下面我们将...

    android AsyncTask 断点下载实例

    在Android开发中,AsyncTask是一种常用的工具类,用于在后台线程执行耗时操作,同时在UI线程更新进度或结果。本实例将探讨如何利用AsyncTask实现断点下载功能,这是一种允许用户在暂停后继续下载大文件的技术,极大...

    Android AsyncTask异步处理下载网页

    Android提供了一种便捷的机制,名为`AsyncTask`,用于在后台线程执行这些任务,同时允许在主线程更新UI。`AsyncTask`是一个轻量级的框架,设计用来简化在Android应用程序中进行后台操作的过程。 `AsyncTask`包含三...

    AsyncTask结合HttpUrlConnection的例子

    在Android开发中,异步处理是非常重要的一环,特别是在与服务器进行数据交互时,为了保持UI线程的流畅性,避免出现"应用无响应"(ANR)的情况,开发者通常会使用`AsyncTask`。本例子是关于如何将`AsyncTask`与`...

    Android AsyncTask(异步) 简单样例

    Android AsyncTask就是一种轻量级的机制,用于在后台执行耗时操作,同时保持用户界面的响应性。本篇文章将深入探讨Android AsyncTask的工作原理、使用方法以及一些常见应用场景。 **一、Android AsyncTask概述** ...

    Android AsyncTask多线程详解

    Android Asynctask 先小试牛刀,了解一下各个方法执行过程,关注博客http://himici.com/

    android asyncTask线程应用

    Android的异步任务(AsyncTask)是Android平台上用于在后台执行耗时操作并更新UI的主要工具,特别适合处理短时间的、与用户界面交互的任务。在Android应用开发中,由于主线程(UI线程)负责处理用户交互,因此不能在...

    Android AsyncTask 下载图片

    Android的`AsyncTask`类就是一个轻量级的工具,用于在后台线程执行耗时任务,然后在UI线程更新结果,从而避免了主线程(UI线程)的阻塞。本篇文章将深入探讨如何使用`AsyncTask`来实现图片的下载,并在下载完成后...

    Android AsyncTask文章集合

    Android的AsyncTask是一个内置的异步执行框架,它允许开发者在主线程之外执行耗时操作,同时保持与主线程的通信,确保UI的流畅性。这个框架特别适用于那些需要进行短时间的后台处理并更新UI的任务,如网络请求、...

    Android开发之AsyncTask机制及使用细节例子源码

    在Android应用开发中,异步任务(AsyncTask)是一个常用工具,用于在后台线程执行耗时操作,然后在UI线程更新结果,避免阻塞用户界面。AsyncTask的使用和内部机制对于任何Android开发者来说都至关重要。让我们深入...

    android中AsyncTask的用法

    在Android应用开发中,AsyncTask是一个用于在后台线程执行耗时操作并更新UI的工具类,它是Android 1.5版本引入的。AsyncTask的设计初衷是为了简化异步编程,避免直接操作线程和Handler带来的复杂性。下面我们将详细...

    android AsyncTask详细介绍

    本文将深入探讨Android的AsyncTask及其与Handler的对比。 **AsyncTask详解** AsyncTask是Android SDK提供的一种轻量级的异步处理机制,特别适合于执行短时间的、与UI相关的后台任务。它的主要优点在于简化了UI更新...

    Android AsyncTask 异步下载 提高篇

    `AsyncTask`是Android提供的一种轻量级的异步处理机制,特别适用于执行耗时操作,如网络请求、数据库操作或图片下载等。在本教程“Android AsyncTask 异步下载 提高篇”中,我们将深入探讨`AsyncTask`的高级用法和...

    Android中异步类AsyncTask用法总结

    AsyncTask 是 Android 平台上一种轻量级的异步处理机制,主要用于在后台执行耗时操作,同时确保结果能够在主线程中安全地更新 UI。它简化了多线程编程,尤其是与用户界面交互的需求。 首先,AsyncTask 包含三个泛型...

    在Android中使用AsyncTask和Handler线程间交互的方式

    在Android中使用AsyncTask和Handler线程间交互的方式,详情参见博客:http://www.cnblogs.com/plokmju/p/android_AsyncTask.html和http://www.cnblogs.com/plokmju/p/android_Handler.html

    Android AsyncTask的缺陷和问题总结

    Android AsyncTask的缺陷和问题总结 在Android开发中,AsyncTask可以使得用户避免直接使用Thread类和Handler 来处理后台操作,适用于需要异步处理数据并将数据更新到界面上的情况。AsyncTask适用于后台操作只有几秒...

    Android AsyncTask的简单Demo

    `AsyncTask`是Android提供的一种轻量级的异步处理机制,它使得在后台线程执行任务并在UI线程更新结果变得更加便捷。本篇文章将深入探讨`AsyncTask`的工作原理和如何在实际项目中使用。 首先,`AsyncTask`类定义了三...

    android AsyncTask中更新progressBar

    在Android开发中,`AsyncTask` 是一个用于在后台线程执行耗时操作并更新UI的工具类。它特别适用于处理网络请求、文件下载等任务,这些任务通常需要在后台执行,以免阻塞主线程(UI线程)并导致应用无响应。在描述中...

Global site tag (gtag.js) - Google Analytics