Android 几种异步方式,解决主线程中遇到的卡顿

简介: 起因:当我们的UI越来越复杂的时候,或者说某个业务需要大量的计算的时候,我们的主线程会消耗大量的资源去计算,这个时候,我们的Activity或者说fragmemt等UI页面就会出现卡顿,乃至ANR。

起因:

当我们的UI越来越复杂的时候,或者说某个业务需要大量的计算的时候,我们的主线程会消耗大量的资源去计算,这个时候,我们的Activity或者说fragmemt等UI页面就会出现卡顿,乃至ANR。总结一下,就是我们直接在主线程(UI线程)中,做耗时操作,就会造成卡顿,甚至ANR

解决方案:

1.优化耗时的计算,提高算法,利用缓存等数据;这种方式,一般带来的提升在App这种场景中微乎其微,只有在大规模的并发场景中才会体现出效果(服务器后台服务中),打个比方,你存一年1W块钱的定期,一年利息才200多块,当你存1000W的时候,一年利息就有20多W,这种效果才明显(手动滑稽)

2.利用异步的方式,简单来说,开启另外一个线程去做耗时操作,利用CPU的多线程模式,这样我们的主线程就不会卡顿在耗时操作中

异步的方式:

1.直接使用继承Thread类或者实现Runable接口(和主线程通信还得使用handler)

2.AsyscTask(它的原理主要是利用线程池,各个历史版本系统版本可能会有不同的缺陷)

3.利用Handler,Message,Looper(主线程默认开启了Looper)

4.RxJava 线程模式.subscribeOn(Schedulers.io()),这样可以开启一个新线程来执行里面的耗时代码

严格的地来说,Android里面,主线程和子线程之间,不能使用sleep(),wait(),notify()等Java原生的线程通信的方式,因为,主线程一旦sleep那么整个App都不能正常运行(所有的Activity,Service等都在主线程运行中呢)

目录
相关文章
|
2月前
|
Java Android开发 UED
🧠Android多线程与异步编程实战!告别卡顿,让应用响应如丝般顺滑!🧵
【7月更文挑战第28天】在Android开发中,确保UI流畅性至关重要。多线程与异步编程技术可将耗时操作移至后台,避免阻塞主线程。我们通常采用`Thread`类、`Handler`与`Looper`、`AsyncTask`及`ExecutorService`等进行多线程编程。
44 2
|
4月前
|
Java 数据库 Android开发
Android异步之旅:探索AsyncTask
Android异步之旅:探索AsyncTask
41 0
|
3月前
|
存储 Java 数据库连接
Android Java开发异步
【6月更文挑战第15天】
|
3月前
|
XML 监控 安全
Android App性能优化之卡顿监控和卡顿优化
本文探讨了Android应用的卡顿优化,重点在于布局优化。建议包括将耗时操作移到后台、使用ViewPager2实现懒加载、减少布局嵌套并利用merge标签、使用ViewStub减少资源消耗,以及通过Layout Inspector和GPU过度绘制检测来优化。推荐使用AsyncLayoutInflater异步加载布局,但需注意线程安全和不支持特性。卡顿监控方面,提到了通过Looper、ChoreographerHelper、adb命令及第三方工具如systrace和BlockCanary。总结了Choreographer基于掉帧计算和BlockCanary基于Looper监控的原理。
56 3
|
3月前
|
JSON Java API
【Android】使用 Retrofit2 发送异步网络请求的简单案例
**摘要:** Retrofit是Android和Java的HTTP客户端库,简化了RESTful API交互。它通过Java接口定义HTTP请求,并提供注解管理参数、HTTP方法等。要使用Retrofit,首先在AndroidManifest.xml中添加`INTERNET`权限,然后在`build.gradle`中引入Retrofit和Gson依赖。创建服务器响应数据类和描述接口的接口,如`Result`和`Api`。通过Retrofit.Builder配置基础URL并构建实例,之后调用接口方法创建Call对象并发送异步请求。
103 1
|
3月前
|
Android开发
40. 【Android教程】AsyncTask:异步任务
40. 【Android教程】AsyncTask:异步任务
88 2
|
4月前
|
存储 Android开发
Android 解决USB TP驱动中触摸卡顿和防抖动问题
Android 解决USB TP驱动中触摸卡顿和防抖动问题
112 1
|
4月前
|
Android开发 对象存储
OSS对象储存android开发进行下载到本地文件时异步操作失效
android vivo80使用官方示例代码进行文件下载,但是使用oss.asyncGetObject(get, new OSSCompletedCallback<GetObjectRequest, GetObjectResult>()时onSuccess和onFailure不执行
|
4月前
|
Android开发 开发者
Android异步之旅:探索IntentService
Android异步之旅:探索IntentService
37 0
|
4月前
|
消息中间件 数据库 Android开发
Android异步之旅:探索HandlerThread
Android异步之旅:探索HandlerThread
43 0