AsyncTask源码分析 & 深层次BUG

Android多线程任务优化1:探讨AsyncTask的缺陷 导语:在开发Android应用的过程中,我们需要时刻注意保障应用的稳定性和界面响应性,因为不稳定或者响应速度慢的应用将会给用户带来非常差的交互体验。在越来越讲究用户体验的大环境下,用户也许会因为应用的一次Force Close(简称FC)或者延迟严重的动画效果而卸载你的应用。由于 阅读详情

(1)AsyncTask 4大回调方法的执行线程

doInBackground

publicProgress

preExecute

postExectue


通常我们的理解是:

doInBackground :异步线程

publicProgress :主线程

preExecute:主线程

postExectue:主线程


但实际上,如果你真这么想,你可得当心了,因为由于安卓系统的Bug,这些方法的执行线程未必如你想的那样。


1. preExecute 和你调用AsyncTask.execute()在同一个线程

这也意味着,如果你在非UI线程里面调用execute()话,在preExecute中执行UI更新操作,很可能会导致异常


2. postExectue, publicProgress使用的是sHandler初始化绑定的线程

通常情况下的安卓系统都会在主线程中加载AsyncTask类,这样sHandler默认会绑定到主线程上,

那么postExectue和publicProgress默认将在主线程中执行,这并没有什么问题。


但是,假设系统有bug,它不在主线程中初始化AsyncTask,那么postExectue中执行某些UI操作将会导致异常。

(你可以自己实现一个AsyncTask,然后在非UI线程中加载它,然后看看各个方法的执行对应线程)


3 doInBackground 的执行线程

这个线程是线程池为你分配的一个线程,也就是说它默认情况下是没有进行办法初始化Handler的。


这就意味着,在极端情况下,这4个回调方法可能在3个不同的线程中执行,并且还都不是主线程。


(2) AsyncTask 线程阻塞

在doInBackground 执行网络拉取操作是错误的写法!!


因为在安卓3.0 之后,AsyncTask的默认执行器是顺序执行的。

它会一个一个的执行你的任务,而不是并发的执行这些任务。

除了第一次,之后scheduleNext();  一定在r.run();后执行,
所以即使是并发线程池,也就一个Runnable执行而已。
所以,网络拉取操作可能阻塞其他AsyncTask.不建议在doBackground中执行。

如果你一定要这么干,请为AsyncTask分配一个额外的执行器。

或者使用v4包里面的AsyncTask.

Type-C转DP1.4转C双向互传转接线方案 Type-C转DP双向互转方案的核心在于利用Type-C接口中的Alt Mode(交替模式)功能。通过利用Type-C接口的Alt Mode功能,该方案实现了Type-C接口与DP接口之间的双向互传,极大地丰富了用户的视觉体验。在选择Type-C转DP双向互转方案时,用户需要关注兼容性、性能需求、线缆长度和品牌等因素,以确保获得最佳的传输质量和使用体验。因此,Type-C转DP双向互转方案应运而生,旨在实现Type-C接口与DP接口之间的无缝连接,满足用户对高效能和高清晰度视频传输的需求。 阅读详情

相关推荐

2022 七校联合NewStarCTF 公开赛赛道 WEEK5|MISC

2022 七校联合NewStarCTF 公开赛赛道 WEEK5|MISC

zerorzeror的博客 3113

Asynctask使用产生bug

Question:最近在项目中出现了偶现的bug,打开详情页面会白屏,只要出现了一次白屏,退出在打开别的文章详情页都是白屏的状态。 解决问题:Android项目中只要可以复现的bug基本上都能通过打断点进行解决(吹个????皮)。可是这个问题是偶现的而且机率极小,于是开始排查问题。 怀疑的问题点: 加载文章内容的接口出了问题 对出现bug的手机进行抓包,发现加载文章内容的接口没有任何问题 加载内容的时...

guaiguai_2015的博客 273

从像素到光影:解析《黑神话:悟空》中Nanite与Lumen的协同渲染革命

本文深度解析了《黑神话:悟空》如何利用Unreal Engine 5的Nanite与Lumen技术实现渲染革命。Nanite处理亿级多边形几何细节,无需传统LOD优化;Lumen提供全动态全局光照,实现实时光线反弹。两者协同工作,为游戏带来电影级视觉体验,重塑了实时渲染的技术标准与工作流程。

f6g7h8i9j的博客 425

使用AsyncTask时需要注意的隐含bug

最近再一次遇到AsyncTask的bug,发现这个问题还比较普遍,而且比较隐含,在此记录一下。 之前写过一个跟图片相关的app,需要对图片进行裁剪,自然而然去GitHub上寻找开源的图片剪裁库。 先用了UCrop,结果发现在我的app里,进入图片裁剪页面后图片一直加载不出来,运行demo可以正常加载;然后又换了Android-Image-Cropper,发现也是同样的情况,在我的app里裁剪页面加...

weixin_33711641的博客 145

基于强化学习的工业SCR脱硝系统控制算法设计与实现

本文提出了一种基于强化学习的工业SCR脱硝系统智能控制方法。针对SCR系统存在的非线性、大滞后和多变量耦合等控制难点,研究采用混合建模方法构建了精度在5%以内的系统模型,并设计了专门的强化学习环境。该方法通过定义合理的动作空间和状态空间,结合物理约束设计损失函数,利用深度强化学习算法优化氨喷射控制策略。相比传统PID控制,该智能控制器能更好地适应烟气参数波动,实现NOx排放的稳定控制,为工业环保设施提供了更优的自动化解决方案。

huanghm88的专栏 1456

通过PXE的方式实现Ubuntu 24.04 自动安装

之前都是通过PXE来自动化安装Redhat系列的,例如:Rocky9、Rocky10、CentOS7、银河麒麟 Kylin-V10、Kylin-V11、OpenEuler 24.03等。现在安装Ubuntu系列的跟红帽的不太一样,所以在这里介绍下。

邢宇宇的博客 1490

AsyncTask的缺陷和问题

       在Android开发中,AsyncTask可以使得用户避免直接使用Thread类和Handler 来处理后台操作,适用于需要异步处理数据并将数据更新到界面上的情况。AsyncTask适用于后台操作只有几秒的短时操作。但是AsyncTask本身存在很多糟糕的问题,如果使用中不注意,将会影响程序的健壮性。 1、生命周期        很多开发者会认为一个在Activity中创建的As...

viclee 2万+

无实习经验?IT应届生简历封神思路:把校园经历写成offer收割机

摘要: IT应届生无实习经历如何打造竞争力简历?本文揭秘“无实习简历封神指南”,通过四大步骤将校园经历转化为HR认可的硬核技能: 素材挖掘:课程设计、个人项目、社团活动、竞赛证书都是隐藏的“实战经验”,用STAR法则细化成果。 技能转化:匹配岗位JD关键词,用“动词+量化结果”包装经历(如“优化查询效率30%”)。 避坑指南:避免流水账、夸大技能或堆砌无关经历,聚焦技术能力与岗位需求。 核心逻辑:HR看重潜力而非经验,用校园经历证明学习能力、问题解决能力和技术落地能力。 无实习≠无竞争力,学会“翻译”经历,

通俗易懂学IT 421

AsyncTask的缺陷以及解决方法

1、AsyncTask常用于进行耗时操作,完成后更新主线程的UI。 2、缺陷:AsyncTask中维护着一个长度为128的线程池,同时可以执行5个工作线程,还有一个缓冲队列,当线程池中已有128个线程,缓冲队列已满时,如果 此时向线程提交任务,将会抛出RejectedExecutionException。 3、解决方法:由一个控制线程来处理AsyncTask的调用判断线程池是否满了,如果满了则线...

MR CUI的专栏 693

YOLO26涨点改进| TGRS 2026 | 独家创新首发、注意力改进篇| 引入LCGA局部曲率引导注意力,保持局部稳定性的同时突出关键几何区域,含多种创新改进,促进YOLO26所有任务高效涨点

🔥本文提出LCGA(局部曲率引导注意力)模块,通过引入曲率信息改进YOLO26网络模型。LCGA在局部窗口内利用深度卷积构造曲率代理,调制标准窗口注意力,使模型更关注道路、边界等曲线型结构,提升遥感图像超分辨率中的几何保真度。相比普通注意力,LCGA能精准聚焦关键几何区域,减少边缘断裂和轮廓偏移,同时保持较低计算开销。实验表明LCGA显著提升性能,在UCMerced数据集上PSNR提升0.2148dB。文章提供了三种改进方案。

Ai缝合怪、助力小伙伴高效发论文 226

还在用 RaiDrive/Rclone 挂载网盘?教您使用Windows 原生 WebDAV 丝滑直连 AList/Openlist,让你的网盘秒变本地硬盘!

网盘文件分散管理?😩 别再依赖第三方工具了!本文教你如何在 Windows 下,利用原生 WebDAV 功能,将 Openlist 网盘直接映射为本地硬盘!💻 操作简单,告别繁琐,让你的云端文件像本地文件一样丝滑!🚀 轻松实现高效管理,快来体验吧!

XiaoqiangClub的博客 2972

《android framework常用api源码分析》之AsyncTask异步任务

AsyncTask是使用非常方便的一个类,经常用于网络请求之后的ui更新。其原理是使用线程池执行futuretask完毕后调用handler机制更新ui。由于线程池是全局单例模式,而且是设定了同时执行线程数量只有一个,所以AsyncTask是按照顺序执行后台线程并且更新ui的。这是AsyncTask重要的特性。本文主要解析AsyncTask的的使用与源码。 首先我们来看一下AsyncTask的基本使用:

一航jason 980

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

危险的AsyncTask

危险的AsyncTask   前几天修改项目,在于数据库同步的时候,发现同步数据一直下载不下来。然后跟踪log,最终发现,我定义的AsyncTask,的doInBackground一直没有执行。本来以为是代码移植(4.4移植到L)时候,framework的同事修改出现的bug,后来google了半天,才发现。原来真正的幕后真凶是AsyncTask。   下面我通过分析源码,结合自身的惨痛教训来

wuqiong5211314的专栏 541

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

FreeRTOS多线程设计:嵌入式实时系统任务划分与通信实战

FreeRTOS多线程并非简单创建任务,而是面向资源受限MCU(如STM32)的确定性并发控制机制。其核心原理基于优先级抢占调度、静态内存管理与轻量级任务上下文切换,技术价值在于保障微秒级响应(≤100μs)、极小RAM占用(≤64KB)及强实时确定性(最坏切换仅71ns)。典型应用场景涵盖工业控制器、光伏逆变器、智能电表等需并行处理ADC采样、CAN通信、PWM控制与协议解析的嵌入式系统。本文聚焦FreeRTOS多线程设计中任务划分、队列通信、栈水位监控与中断安全交互等工程落地关键点,直击裸机迁移与量产稳

weixin_34013044的博客 312

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【Android源码】源码分析深度好文+精编内核解析分享

阅读Android源码的好处有很多,比如:可以加深我们对系统的了解;可以参考牛人优雅的代码实现;可以从根本上找出一些bug的原因...我们应该庆幸Android是开源的,所有的功能都可以看到实现,所有的bug都能追踪溯源。但面对庞大的Android源码项目,许多人会望而却步,不知道从哪儿下手。 如何阅读源码呢?这是个头疼的问题,但是源码必须要读。阅读源码的时候不要深入代码细节不可自拔,要关注代码的流程并尽量挖掘出对应用层开发有用的结论。另外仔细阅读源码中对一个类或者方法的注释,在看不懂源码时,源码中的注释

m0_59162559的博客 1200

源码解析Android中AsyncTask的工作原理

在之前的博客《Android中AsyncTask使用详解》中我们提到AsyncTask是对Thread和Handler的组合包装,本文将通过解析的方式让大家了解AsyncTask的工作原理。AsyncTask的源码链接https://github.com/android/platform_frameworks_base/blob/master/core/java/android/os/AsyncTa

孙群 1万+

AsyncTask异步任务类

目录介绍 01.先看下AsyncTask用法 02.AsyncTask源码深入分析 2.1 构造方法源码分析 2.2 看execute(Params... params)方法 2.3 mWorker和mFuture的创建过程 03.异步机制的实现 04.不同的SDK版本区别 05.AsyncTask的缺陷和问题 5.1 AsyncTask对应线程池 5.2 AsyncTask生命周期问题...

weixin_34400525的博客 300

AsyncTask源码解析

之前在项目上遇到一个bug,启动了异步线程,但是硬是没有执行,打印日志主线程中execute()方法前后都已经执行,只有AsyncTask的doInBackground中的日志没有打印出来。当时不明白是为何,后来在同事的指点下查看AsyncTask的源码,了解了AsyncTask原理就明白了。这里做下记录。 源码基于android6.0版本 先回顾下AsyncTask中使用时常用的几个方法:

xiaoxiaoxixi465trr的博客 85

【建议收藏】Android中高级大厂面试源码秘籍,为你备战2021金三银四,直通大厂

小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!资料⬅专栏获取。

2401_85667460的博客 1022

Android O - java.lang.RuntimeException: An error occurred while executing doInBackground()

最近任务列表中多了一个bug,让在这个sprint中解决掉,bug的堆栈信息如下: Fatal Exception: java.lang.RuntimeException: An error occurred while executing doInBackground() at android.os.AsyncTask$3.done(AsyncTask.java:353) ...

周将的博客 1万+

如何阅读源码?这篇《Android开发源码精编解析》助你进阶提升

阅读源码是每个优秀开发工程师的必经之路,那么我们要如何阅读源码呢?首先要明白我们为什么要读源码,比如:在阅读之前,可以先从开源项目的官网上看它的架构设计和功能文档,了解这个项目的整体架构、模块组成以及各个模块之间的联系。如果没有对应的项目文档,可以根据代码的模块进行梳理,以形成对项目的初步了解,或者查看已有的源码解析文章或者书籍,在阅读源码之前,了解项目的架构和思路会使阅读源码事半功倍。1.深入解析微信MMKV源码2.深入解析阿里巴巴路由框架ARouter 源码3.深入解析AsyncTask 源码(一款 A

Android23333的博客 197

Android Review -- 面试准备

载录自:https://developer.android.google.cn 多线程 Processes and Application Lifecycle 进程和线程 进程 进程生命周期 线程 工作线程 >> AsyncTask 线程安全方法 进程间通信 Sending operations to multiple threads Specify the c...

wo_sxn的博客 321

再读底层源码,突破瓶颈不能错过的558+452页Android核心源码学习笔记

前言 现在Android开发行业逐渐成熟,猪都能起飞的时代已经过去,开发市场对Android开发者的要求也越来越高。 在初中级移动开发者爆满的情况下,进阶学习成为了一个迫在眉睫又进展艰难的痛点。而进阶学习势必要钻研底层源码。 网上各类源码解析的文章博客五花八门、良莠不齐。要么杂乱、零散、碎片化,看着看着就衔接不上了,要么内容质量太浅,学不到干货。 今天要推荐给大家的是一份良心巨作!由阿里大佬熬夜整理的558页Android核心源码和452页Framework源码的解析精编,现开放下载! 相信看完这份文档,你

老皮的博客 209
上一篇: Java I/O全文摘要(十三)过滤流,对象序列化
下一篇: Android中一种ThreadPool的实现
computer165
博客等级 码龄16年 7粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值