AsyncTask

AsyncTask 已废弃,但面试常问一些问题 AsyncTask曾被广泛用于简化Android后台任务与UI线程通信,但其设计缺陷日益凸显:生命周期不绑定Activity导致内存泄漏和崩溃风险;默认串行执行影响效率;配置变更时行为异常;不同版本实现差异大。Google在Android 11弃用AsyncTask,因其难以修复的架构缺陷与现代开发模式不兼容。推荐采用Kotlin协程结合ViewModel等现代方案,它们具有生命周期感知、线程切换灵活、配置变更无缝衔接等优势,能有效避免AsyncTask的各种问题,是当前官方推荐的最佳实践。 阅读详情
//三种泛型类型分别代表“启动任务执行的输入参数”、“后台任务执行的进度”、“后台计算结果的类型”。在特定场合下,并不是所有类型都被使用,如果没有被使用,可以用java.lang.Void类型代替
private class MyTask extends AsyncTask<String, Integer, String> {
    // onPreExecute方法用于在执行后台任务前做一些UI操作
    @Override
    protected void onPreExecute() {
        textView.setText("loading...");
    }

    // doInBackground方法内部执行后台任务,不可在此方法内修改UI(开子线程做事情)
    @Override
    protected String doInBackground(String... params) {
        try {
            HttpClient client = new DefaultHttpClient();
            HttpGet get = new HttpGet(params[0]);
            HttpResponse response = client.execute(get);
            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                HttpEntity entity = response.getEntity();
                InputStream is = entity.getContent();
                long total = entity.getContentLength();
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                byte[] buf = new byte[1024];
                int count = 0;
                int length = -1;
                while ((length = is.read(buf)) != -1) {
                    baos.write(buf, 0, length);
                    count += length;
                    // 调用publishProgress公布进度,最后onProgressUpdate方法将被执行
                    publishProgress((int) ((count / (float) total) * 100));
                    // 为了演示进度,休眠500毫秒
                    Thread.sleep(500);
                }
                return new String(baos.toByteArray(), "gb2312");
            }
        } catch (Exception e) {
        }
        return null;
    }

    // onProgressUpdate方法用于更新进度信息
    @Override
    protected void onProgressUpdate(Integer... progresses) {
        progressBar.setProgress(progresses[0]);
        textView.setText("loading..." + progresses[0] + "%");
    }

    // onPostExecute方法用于在执行完后台任务后更新UI,显示结果
    @Override
    protected void onPostExecute(String result) {
        textView.setText(result);

        execute.setEnabled(true);
        cancel.setEnabled(false);
    }

    // onCancelled方法用于在取消执行中的任务时更改UI
    @Override
    protected void onCancelled() {
        textView.setText("cancelled");
        progressBar.setProgress(0);

        execute.setEnabled(true);
        cancel.setEnabled(false);
    }
}

//注意每次需new一个实例,新建的任务只能执行一次,否则会出现异常
mTask = new MyTask();
mTask.execute("http://www.baidu.com");
// 取消一个正在执行的任务,onCancelled方法将会被调用
 mTask.cancel(true);

在使用的时候,有几点需要格外注意:

1.异步任务的实例必须在UI线程中创建。

2.execute(Params... params)方法必须在UI线程中调用。

3.不要手动调用onPreExecute(),doInBackground(Params... params),onProgressUpdate(Progress... values),onPostExecute(Result result)这几个方法。

4.不能在doInBackground(Params... params)中更改UI组件的信息。

5.一个任务实例只能执行一次,如果执行第二次将会抛出异常。




血管分割中的直径平衡难题:从clDice到cbDice的演进与实践 本文探讨了血管分割中的直径平衡难题,详细分析了从clDice到cbDice的技术演进与实践。通过引入半径感知权重和边界对齐惩罚,cbDice在保持拓扑完整性的同时提升了几何敏感度,显著改善了细小血管的分割效果。文章还分享了在nnU-Net中实现cbDice的工程细节,包括GPU加速骨架提取和多任务损失组合策略,为医学影像分析提供了重要参考。 阅读详情

相关推荐

谈谈 FOC和BLDC 电机控制

更具体地说,通过 “Park 变换”,我们可以把三相交流电流信号转换成两相直流电流信号,从而可以把三相交流电机的控制变得和两相直流电机控制一样简单。在内环 “电流环”中,一些比较重要的模块有 “Clark 变换” 和 “Park 变换” 等数学模块、电机电流信号检测模块以及能够提供电机的转速和转角位置信息的模块。日前,Qorvo 电机控制应用高级系统/应用工程师张绍发表了一个与 BLDC 和 FOC 相关的演讲,科普了 FOC 的相关知识,还讲解了 Qorvo 用于简化 FOC 实施方案的方法。

U_YAO的博客 2118

Android AsyncTask 深度解析

params)返回的结果,参数类型由AsyncTask类上的第三个泛型限定;onPreExecute()和onPostExecute()方法都执行在主线程,onProgressUpdate()能够更改UI(更改进度条进度)必然也是主线程。这个小demo通过求1-10的和,在doInBackground()方法中通过延时的方式模拟了耗时操作,简单的演示了AsyncTask的使用。doInBackground()方法执行在线程池某一线程中,(看过源码后得到的结果,通过Log可以知道该方法没有执行在主线程中)

2501_90389522的博客 1582

2.1 SRv6 TE Policy

SRv6 TE Policy是在SRv6技术基础上发展的一种新的隧道引流技术。SRv6 TE Policy路径表示为指定路径的段列表(Segment List),称为SID列表(Segment ID List)。每个SID列表是从源到目的地的端到端路径,并指示网络中的设备遵循指定的路径,而不是遵循IGP计算的最短路径。如果数据包被导入SRv6 TE Policy中,SID列表由头端添加到数据包上,网络的其余设备执行SID列表中嵌入的指令。

m0_70976024的博客 1237

Android AsyncTask 源码解析

一个接着一个的执行,相当于单线程。22行:将我们传入的参数赋值给了mWorker.mParams ,mWorker为一个Callable的子类,且在内部的call()方法中,调用了doInBackground(mParams),然后得到的返回值作为postResult的参数进行执行;看到这里,大家可能会认为,背后原来有一个线程池,且最大支持128的线程并发,加上长度为10的阻塞队列,可能会觉得就是在快速调用138个以内的AsyncTask子类的execute方法不会出现问题,而大于138则会抛出异常。

2401_89790938的博客 991

Android实现TextToSpeech控件实现语音播报--朗读文字 (附完整源码)

Android实现TextToSpeech控件实现语音播报--朗读文字 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1117

资源分享·病毒样本下载资源分享

一、微步云沙箱 微步在线云沙箱https://s.threatbook.cn/ 使用病毒sha256即可寻找病毒样本;该站点也可上传可疑文件/可疑URL地址到沙箱中,进行分析 。 以永恒之蓝为例,样本sha256是:ed01ebfbc9eb5bbea545af4d01bf5f1071661840480439c6e5babe8e080e41aa 下载样本或流量监控,需要消耗积分: 二、AnyRun Interactive Online Malware Analysis Sandbox.

不忘初心,护天下安全! 2万+

Android AsyncTask 详解

将复杂工作异步化、线程化对于Android 的性能的提高起到了很重要的作用,Android 框架为开发提供了很多辅助程序,这一篇着重分析Android AsyncTask的原理。

私房菜 6810

CKAD-CN考试之路----12

显然,对应的value都已经实现了加密.保存退出,等待pod重新创建。确认secret是否被加密。编辑secret文件。

Q先生 446

android之AsyncTask

android之AsyncTask

qq_44910624的博客 291

用 SemanticObject 把字段变成可点击链接:Fiori Elements Navigation Using a Link 的工程化实践

SAP Fiori elements 通过 Common.SemanticObject 注解可将字段转为可点击链接,实现应用间跳转。当源字段名与目标属性名不一致时,需使用 Common.SemanticObjectMapping 进行映射。该功能依赖 Fiori Launchpad 的目标映射配置,确保正确解析 semantic object + action 并传递参数。常见误区包括未配置目标映射或字段映射错误,需逐一检查语义标注、intent 解析和参数传递链路。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 272

【Matlab】刃边法计算mtf

摘要:刃边法是一种测量光学系统调制传输函数(MTF)的常用方法。本文介绍了基于Matlab的MTF计算实现方案,包括图像灰度化、梯度计算、刀口方向选择、梯度投影等关键步骤,并给出了完整的代码实现。该方案可通过添加图像预处理、多方向计算、函数封装等方式进行扩展,提高MTF计算的准确性和实用性,适用于不同应用场景的光学系统性能评估需求。(148字)

unber的博客 389

Android AsyncTask理解

AsyncTask的特点是任务在主线程之外运行,而回调方法是在主线程中执行,这就有效地避免了使用Handler带来的麻烦。阅读AsyncTask的源码可知,AsyncTask是使用java.util.concurrent 框架来管理线程以及任务的执行的,concurrent框架是一个非常成熟,高效的框架,经过了严格的测试。这说明AsyncTask的设计很好的解决了匿名线程存在的问题。 AsyncTask是抽象类,其结构图如下图所示:  AsyncTask定义了三种泛型类型 Params,Pr

zhenyongyuan123的专栏 2万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【Android】AsyncTask 实现登陆

In Android,AsyncTask(Asynchronous Task) allows us to run the instruction in the background and then synchronize again with our main thread. This class will override at least one method i.e doInBackg...

liudongdong_jlu 1139

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

AsyncTask隐藏的陷阱

当AsyncTask被介绍到Android中时,它被贴上“无忧线程”的标签。其目标是让与UI线程交互的后台线程变得更容易。从这一点上讲它是成功的,但并非绝对安全————有很多AsyncTask无法应对的情况。如果不小心处理,不会考虑到AsyncTask出错的情况,很容易盲目使用AsyncTask。下面是一些未充分理解AsyncTask会遇到的问题:   AsyncTask与(屏幕)旋转 As

snow4dev的专栏 5506

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

AsyncTask异步任务

AsyncTask 是 Android 中用于异步处理的工具类,它简化了后台线程与主线程间的交互,适合执行网络请求、文件读写等短时任务。核心方法包括 onPreExecute()、doInBackground() 和 onPostExecute(),分别用于任务初始化、后台执行和结果处理。但需要注意:1) 已被 Android 11 标记为废弃;2) 存在内存泄漏风险;3) 不适合复杂任务。现代开发推荐使用 Kotlin 协程或 WorkManager 替代。理解 AsyncTask 仍有助于维护旧代码和学

likuoelie的博客 800

android AsyncTask介绍

AsyncTask和Handler对比 1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程. 使用的优点: l 简单,快捷 l 过程可控 使用的缺点: ...

u012123938的专栏 409

Android 异步操作AsyncTask

3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params…onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread.onPreExecute() ----》doInBackground()------》onPostExecute()基本流程方法都游走一边。

2401_89689665的博客 968

DeepTutor 快速上手:自托管 AI 学习助手完整指南

同一个问题问通用聊天机器人,得到的是一篇教科书式长文,它翻都不翻你给它的教材。DeepTutor 是另一类东西:一款自托管、Agent 原生的 AI 学习助手,对话、解题、出题、深度研究全部跑在同一个 Agent 循环上,数据默认留在本地机器。下面按真实使用顺序走一遍,从装好到问出第一句话,再到喂资料、出卷子。 ## 安装并初始化:pip 与 deeptutor init 搞定端口和模型 先让

gitblog_00905的博客 989

AsyncTask源码详解

在分析源码之前,首先引用一段源码中的注释说明AsyncTask的定义: AsyncTask能够正确,方便的使用UI线程。AsyncTask可以在不用使用Threads 和 handlers的情况下,操作后台线程并且将结果发送给UI线程。 AsyncTask是为Thread和Handler而设计的帮助类,并且它应当使用在一些耗时较短的操作上,如果需要让线程保持长时间的运行,强烈的推荐使用 java...

weixin_33767813的博客 232

AsyncTask原理

为什么要用AsyncTask我们知道,Android应用的主线程(UI 线程,是线程不安全的,负责前台用户界面的绘制以及响应用户的操作)肩负着绘制用户界面和及时响应用户操作的重任,为了避免“用户点击按钮后没反应”这样的糟糕用户体验,我们就要确保主线程时刻保持着较高的响应性,主线程不能够运行需要占用大量CPU时间片的任务(如大量复杂的浮点运算,较大的磁盘IO操作,网络socket等)。为了做到这一点,

GeofferySun的专栏 1666

由Future, FutureTask,Callable再到AsyncTask

如转载请标明出处:https://blog.youkuaiyun.com/dxh040431104/article/details/93329349 Future, FutureTask,Callable网上的说明很多,我这里就不说了,只说一些我的见解 FutureTask是一个实现了Future的Runable,所以它可以直接丢到Thread中使用如 Callable<Integer&g...

dxh040431104的专栏 1079

AsyncTask详解

什么是AsyncTask 它本质上就是一个封装了线程池和handler的异步框架,AsynTask框架主要是用来执行异步任务的,因为内部封装有handler可以灵活地在UI线程和子线程之间切换交互. AsynTask的使用方法 主要是: 1. 三个参数 第一个定义传进来的数据的类型 第二个定义进度要显示的进度 第三个定义要返回给用户的数据 2.五个方法 1、首先调用onPreExecute方法,...

sugar_3BigRed的博客 3336

Android 异步处理AsyncTask

简介 Android中的AsyncTask适用于简单的异步任务处理。 AsyncTask是封装过的后台任务类,异步任务。它大大降低了开发难度。 复杂的异步任务开发推荐使用Handler加Thread。 为什么要用异步? 耗时操作不在UI线程中执行,会导致UI堵塞,严重影响用户体验。 Android中网络操作如果在UI线程中执行会直接报错。 功能介绍 AsyncTask定义了三...

weixin_39821531的博客 201
上一篇: onMeasure
下一篇: android路径
dcking
博客等级 码龄18年 8粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值