Android `AsyncTask`简要分析

AsyncTask简要分析

经典异步任务:AsyncTask,使用场景有:批量下载,批量拷贝等。官方文档就直接给出了一个批量下载的示例。

    private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {protected Long doInBackground(URL... urls) {int count = urls.length;long totalSize = 0;for (int i = 0; i < count; i++) {totalSize += Downloader.downloadFile(urls[i]);publishProgress((int) ((i / (float) count) * 100));// Escape early if cancel() is calledif (isCancelled()) break;}return totalSize;}protected void onProgressUpdate(Integer... progress) {setProgressPercent(progress[0]);}protected void onPostExecute(Long result) {showDialog("Downloaded " + result + " bytes");}}// Once created, a task is executed very simply:new DownloadFilesTask().execute(url1, url2, url3);

这里简单看一下,AsyncTask中的几个经典问题:

  1. AsyncTask开了几个线程?
  2. AsyncTask怎么实现的线程调度?

好吧,就想到了这两个问题。第一个问题,明显是坑。答案是未知的。看手机 cpu个数了。

private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
// We want at least 2 threads and at most 4 threads in the core pool,
// preferring to have 1 less than the CPU count to avoid saturating
// the CPU with background work
private static final int CORE_POOL_SIZE = Math.max(2, Math.min(CPU_COUNT - 1, 4));
private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;

然后是第二个问题。简单回答就是一句话,通过开启线程执行具体逻辑,然后通过handler将结果发送到主线程。

进一步追踪的话,就会发现,AsyncTask = ThreadPoolExecutor + Handler 。

通过源码可以看到,AsyncTask在构造方法里面,已经完成了全部的准备工作。

  • MainHandler已经创建。
  • FutureTask已经准备了。(说实话,FutureTask难过的让人吐血)

         public AsyncTask(@Nullable Looper callbackLooper) {mHandler = callbackLooper == null || callbackLooper == Looper.getMainLooper()? getMainHandler(): new Handler(callbackLooper);mWorker = new WorkerRunnable<Params, Result>() {public Result call() throws Exception {mTaskInvoked.set(true);Result result = null;try {Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);//noinspection uncheckedresult = doInBackground(mParams);  // mParams 核心逻辑Binder.flushPendingCommands();} catch (Throwable tr) {mCancelled.set(true);throw tr;} finally {postResult(result);  // 核心逻辑}return result;}};mFuture = new FutureTask<Result>(mWorker) {@Overrideprotected void done() {try {postResultIfNotInvoked(get());  // 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);}}};}
  • 系消息

      @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;}// 核心逻辑:handler,将结果发送到主线程private Result postResult(Result result) {@SuppressWarnings("unchecked")Message message = getHandler().obtainMessage(MESSAGE_POST_RESULT,new AsyncTaskResult<Result>(this, result));message.sendToTarget();return result;}
    原文地址https://www.cnblogs.com/pythoncat/p/10514933.html
    

Android `AsyncTask`简要分析相关推荐

  1. android AsyncTask 的分析与运用

    线程 在Android当中,通常将线程分为两种,一种叫做Main Thread,除了Main Thread之外的线程都可称为Worker Thread. 当一个应用程序运行的时候,Android操作系 ...

  2. android wifi的进程,Android wifi简要分析

    这里列了很多,但是大致可以分为四个主要的类ScanResult wifiConfiguration WifiInfo WifiManager (1)ScanResult,主要是通过wifi 硬件的扫描 ...

  3. Android Hal层简要分析

    Android Hal层简要分析 Android Hal层(即 Hardware Abstraction Layer)是Google开发的Android系统里上层应用对底层硬件操作屏蔽的一个软件层次, ...

  4. Android L Settings 简要分析

    1.本文说明 本文主要针对L平台上Settings模块正常启动流程做一个简要分析,并试着分析一下Settings下面Storage选项的实现过程. 2.Settings概览 在之前的KK平台上Sett ...

  5. Android 5.1 Settings源码简要分析

    概述: 先声明:本人工作快两年了,仍是菜鸟级别的,惭愧啊!以前遇到好多知识点都没有记录下来,感觉挺可惜的,现在有机会接触Android 源码.我们一个Android组的搞Setting,我觉得是得写得 ...

  6. Android AsyncTask两种线程池分析和总结

    转自:http://bbs.51cto.com/thread-1114378-1-1.html Android AsyncTask两种线程池分析和总结 (一)    前言 在android Async ...

  7. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(34)-文章发布系统①-简要分析...

    构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(34)-文章发布系统①-简要分析 原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入 ...

  8. Android Studio +MAT 分析内存泄漏实战

    点击打开链接 对于内存泄漏,在Android中如果不注意的话,还是很容易出现的,尤其是在Activity中,比较容易出现,下面我就说下自己是如何查找内存泄露的. 首先什么是内存泄漏? 内存泄漏就是一些 ...

  9. Android系统启动流程分析之安装应用

    2016六月 21 原 Android系统启动流程分析之安装应用 分类:Android系统源码研究 (295)  (0)  举报  收藏 跟随上一篇博客Android系统的启动流程简要分析继续分析an ...

最新文章

  1. GoDaddy万用https ssl证书如何通过DNS审核
  2. 如何防止无线网络被破解
  3. 视觉SLAM总结——视觉特征子综述
  4. wasm-simd入门(卷积指令)
  5. Android之解决开启热点后跳转页面不稳定问题
  6. sharepoint项目部署
  7. [编织消息框架][网络IO模型]AIO
  8. linux挂载nfs权限不够,无法写入挂载点(nfs-server),获得“权限被拒绝”
  9. Git学习笔记 - 钢钢更新
  10. 如何在Windows上制作一个包含.lib和.dll的Rust Crate包
  11. python 清屏_见识Python百宝箱,十行代码制作动态广告牌
  12. LightTools.v5.1_完整好用版本\
  13. 汉源高科2个万兆光24千兆网口万兆机架式工业交换机支持G.8032(ERPS)标准的以太环网交换机
  14. SNMP(简单网络管理协议)详解
  15. 量化投资学sql还是mysql_新人如何学习量化投资
  16. c语言入门ppt演示,c语言学习ppt-C语言入门教程ppt(共434页)免费版【精品课件】-东坡下载...
  17. C# 使用ZXing.net生成一维码(带数字与不带数字)、二维码(带logo与不带logo)
  18. word文档分栏怎么设置
  19. 5WHY分析法 学习笔记
  20. 《给李彦宏先生的一封信》

热门文章

  1. 我国物联网环境尚未成熟 传感器面临机遇
  2. 强大的DataGrid组件[7]_自定义DataGrid——Silverlight学习笔记[15]
  3. android BSP
  4. 【android】进程优先级(Framework设置优先级,LowMemoryKiller查杀)
  5. 【Android】自定义Loader:loadInBackground+onStartLoading+onStopLoading+onReset+onCanceled
  6. 寻址(实模式和保护模式)
  7. Python程序中的线程操作-锁
  8. 理解严格模式下JavaScript的this指向的变化
  9. css_position
  10. Mysql 中的Text字段的范围