Android `AsyncTask`简要分析
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
中的几个经典问题:
AsyncTask
开了几个线程?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`简要分析相关推荐
- android AsyncTask 的分析与运用
线程 在Android当中,通常将线程分为两种,一种叫做Main Thread,除了Main Thread之外的线程都可称为Worker Thread. 当一个应用程序运行的时候,Android操作系 ...
- android wifi的进程,Android wifi简要分析
这里列了很多,但是大致可以分为四个主要的类ScanResult wifiConfiguration WifiInfo WifiManager (1)ScanResult,主要是通过wifi 硬件的扫描 ...
- Android Hal层简要分析
Android Hal层简要分析 Android Hal层(即 Hardware Abstraction Layer)是Google开发的Android系统里上层应用对底层硬件操作屏蔽的一个软件层次, ...
- Android L Settings 简要分析
1.本文说明 本文主要针对L平台上Settings模块正常启动流程做一个简要分析,并试着分析一下Settings下面Storage选项的实现过程. 2.Settings概览 在之前的KK平台上Sett ...
- Android 5.1 Settings源码简要分析
概述: 先声明:本人工作快两年了,仍是菜鸟级别的,惭愧啊!以前遇到好多知识点都没有记录下来,感觉挺可惜的,现在有机会接触Android 源码.我们一个Android组的搞Setting,我觉得是得写得 ...
- Android AsyncTask两种线程池分析和总结
转自:http://bbs.51cto.com/thread-1114378-1-1.html Android AsyncTask两种线程池分析和总结 (一) 前言 在android Async ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(34)-文章发布系统①-简要分析...
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(34)-文章发布系统①-简要分析 原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入 ...
- Android Studio +MAT 分析内存泄漏实战
点击打开链接 对于内存泄漏,在Android中如果不注意的话,还是很容易出现的,尤其是在Activity中,比较容易出现,下面我就说下自己是如何查找内存泄露的. 首先什么是内存泄漏? 内存泄漏就是一些 ...
- Android系统启动流程分析之安装应用
2016六月 21 原 Android系统启动流程分析之安装应用 分类:Android系统源码研究 (295) (0) 举报 收藏 跟随上一篇博客Android系统的启动流程简要分析继续分析an ...
最新文章
- GoDaddy万用https ssl证书如何通过DNS审核
- 如何防止无线网络被破解
- 视觉SLAM总结——视觉特征子综述
- wasm-simd入门(卷积指令)
- Android之解决开启热点后跳转页面不稳定问题
- sharepoint项目部署
- [编织消息框架][网络IO模型]AIO
- linux挂载nfs权限不够,无法写入挂载点(nfs-server),获得“权限被拒绝”
- Git学习笔记 - 钢钢更新
- 如何在Windows上制作一个包含.lib和.dll的Rust Crate包
- python 清屏_见识Python百宝箱,十行代码制作动态广告牌
- LightTools.v5.1_完整好用版本\
- 汉源高科2个万兆光24千兆网口万兆机架式工业交换机支持G.8032(ERPS)标准的以太环网交换机
- SNMP(简单网络管理协议)详解
- 量化投资学sql还是mysql_新人如何学习量化投资
- c语言入门ppt演示,c语言学习ppt-C语言入门教程ppt(共434页)免费版【精品课件】-东坡下载...
- C# 使用ZXing.net生成一维码(带数字与不带数字)、二维码(带logo与不带logo)
- word文档分栏怎么设置
- 5WHY分析法 学习笔记
- 《给李彦宏先生的一封信》
热门文章
- 我国物联网环境尚未成熟 传感器面临机遇
- 强大的DataGrid组件[7]_自定义DataGrid——Silverlight学习笔记[15]
- android BSP
- 【android】进程优先级(Framework设置优先级,LowMemoryKiller查杀)
- 【Android】自定义Loader:loadInBackground+onStartLoading+onStopLoading+onReset+onCanceled
- 寻址(实模式和保护模式)
- Python程序中的线程操作-锁
- 理解严格模式下JavaScript的this指向的变化
- css_position
- Mysql 中的Text字段的范围