Android性能优化—线程管理

UniApp安卓原生插件实战:从零构建到集成发布 本文详细介绍了UniApp安卓原生插件的开发全流程,从环境搭建到代码编写、调试优化,再到最终集成发布。通过实战案例解析,帮助开发者解决H5功能限制和性能瓶颈问题,实现蓝牙打印等硬件功能的高效调用。重点讲解了原生插件开发的核心技巧和常见避坑指南,提升UniApp项目的扩展性和性能表现。 阅读详情

什么是线程

线程,有时被称为轻量级进程,是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针,寄存器集合和堆栈组成,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。

线程是程序中一个单一的顺序控制流程。进程内有一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指令运行时的程序的调度单位。

线程的状态

线程也有就绪、阻塞和运行三种基本状态。

  1. 就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;

  2. 运行状态是指线程占有处理机正在运行;

  3. 阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。

    线程状态图

内存和线程

增加并发的线程数会导致内存消耗的增加,平衡好这两者的关系是非常重要的。我们知道,多线程并发访问同一块内存区域有可能带来很多问题,例如读写的权限争夺问题,ABA问题等等,因而我们会需要引入锁的概念。

Android中的线程

目的

执行一些耗时、易阻塞的事务,以防止主线程阻塞,造成不可逆的异常。

核心数

以设备CPU核心数为基准来计算线程池的核心数,在性能优化上要保证线程的数量不能大起大落(线程是消耗性能)。

Looper、Handler、MessageQueue、Message

Android中提供了Looper、Handler、MessageQueue、Message的线程设计模型。
Looper: 保证线程存活且不断的在任务队列中获取任务执行。
MessageQueue: 使用Message,Runnable作为任务的载体在不同的线程之间进行传递。
Message: 任务载体。
Handler: 帮助实现队列任务的管理,不仅仅能够把任务插入到队列的头部,尾部,还可以按照一定的时间延迟来确保任务从队列中能够来得及被取消掉。

Android多线程方案

AsyncTask:为 UI 线程与工作线程之间进行快速的切换提供一种简单便捷的机制。

executeOnExecutor: 执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行。
onPreExecute: 在executeOnExecutor被调用后立即执行,一般用来在执行后台任务前对UI做一些标记。
doInBackground: 在onPreExecute完成后立即执行,用于执行较为费时的操作,此方法将接收输入参数和返回计算结果。在执行过程中可以调用publishProgress来更新进度信息。
onProgressUpdate: 在调用publishProgress时,此方法被执行,直接将进度信息更新到UI组件上。
onPostExecute: 当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上。


由图可见,AsyncTask为Android开发者提供了一种便捷的主线程和子线程通信的解决方案——将耗时、易阻塞的事务放在子线程中处理,将子线程处理的结果通过Message传递给主线程的Handler处理。

当然,AsyncTask也可以提供为两个不同子线程间通信的方案(实际开发过程中几乎不使用),即自定义Looper(非主线程)的Handler,若是如此,在onPreExecute、onProgressUpdate、onPostExecute等方法中不能执行主线程才能执行的任务,如界面刷新。

HandlerThread:为某些回调方法或者等待某些任务的执行设置一个专属的线程,并提供线程任务的调度机制。

HandlerThread我们可以理解为是一个带有Looper的的Thread(在run()中执行Looper等loop()),然后将这个Looper设置到Handler中,然后通过Handler处理相关等事务,此时的Handler中的Looper是非主线程的Looper,所以它不能处理只能在主线程处理的操作,如界面刷新。具体见Handler和Looper关系图。

ThreadPool:把任务分解成不同的单元,分发到各个不同的线程上,进行同时并发处理。

线程池,顾名思义,它是一个线程管理等池子,它可以自定义池子中等线程数,自定义线程wait的最长时间(线程保活时间),自定义任务队列且给任务排序等。

IntentService:适合于执行由 UI 触发的后台 Service 任务,并可以把后台任务执行的情况通过一定的机制反馈给 UI。

IntentService是一个Service+HandlerThread的组合。他继承了Service和HandlerThread的所有特性,需要实现onHandleIntent方法,该方法是在子线程执行的。

WorkManager

这是今年I/O大会上推出的一个新架构组建——管理一些要在后台工作的任务, – 即使你的应用没启动也能保证任务能被执行。

常见问题(截图中代码仅用于举例)

线程常见问题有下面几个方面:

1、共享数据同步问题

线程间执行时是无序的,需要通过加锁的方式来保证同一份共享数据的完整性。

2、内存泄漏问题

此种情况产生等比较多,诸如Handler泄漏、Timer泄漏(结束后没有cancel)、线程池泄漏(在线程池中等待的事务较多,而等待的Runnable持有了需要释放的对象)等等

Handler泄漏

Timer泄漏

3、异步数据结果返回后,界面未初始化完成或者界面已经销毁。Activity执行了销毁操作后异步结果才回来,mTv已经为NULL
4、不合理的创建线程(池)导致消耗大量内存空间,造成主线程竞争CPU压力大。

创建线程是消耗性能、消耗资源等操作,大概一个线程需要消耗64KB的内存。

不合理的创建线程(池)

优化

1、 定义全局的ThreadMananger管理类,通过一个全局的线程池管理一些new Thread的操作。
2、 定义线程池的时候使用final static结构定义该线程池,以免该类或该方法短时间内重复调用而导致线程增多。
3、 带有定时器的性质的线程(HandlerThread、Timer),退出时一定要做退出或者取消操作(防止内存泄漏),尽可能用HandlerThread替代Timer。
4、 App实现一套符合自身业务(如带有优先级)的线程池。

总结

线程它就像一面双刃剑,用的好的时候可以给我们带来事半功倍等效果,用的不好时就会给我们带来困扰,并且这个困扰还不是一时半会能解决掉的(因为发现问题的时候,往往是到了需要优化期了,各项业务相互牵扯),故在项目初期就需要严格考虑考量这些问题了。

Android Handler/Looper线程管理实战攻略:从零到企业级开发 本文全面解析Android Handler/Looper线程管理机制,从核心原理到企业级开发实战,涵盖主线程与子线程管理、跨线程通信(HandlerThread/RxJava)、消息队列优化及性能调优。通过代码示例详解线程安全、资源管理及生命周期控制,助力开发者高效构建稳定应用,避免ANR和内存泄漏问题。 阅读详情

相关推荐

UNIAPP监听安卓原生广播:原理、实现与性能优化指南

在移动应用开发中,系统事件监听是实现深度系统交互的基础能力。安卓广播机制作为系统级消息传递的核心组件,允许应用响应网络状态变化、电池电量、屏幕开关等关键事件。其原理基于Intent的发布与订阅模型,通过BroadcastReceiver组件实现跨应用通信。对于采用Vue.js框架的UNIAPP开发者而言,理解JavaScript运行环境与安卓原生层的隔离是关键挑战,这涉及到WebView与原生线程间的跨语言通信。通过原生插件桥接技术,开发者可以突破框架限制,实现UNIAPP官方API未覆盖的系统功能,这在物

weixin_29001327的博客 350

Android 内存治理之线程

当我们在应用程序中启动一个线程的时候,也是有可能发生OOM错误的。当我们看到以下log的时候,就说明系统分配线程栈失败了。这种情况可能是两种原因导致的。第一个就是系统的内存不足的时候,我们去启动一个线程。第二种就是进程内运行的线程总数超过了系统的限制。如果是内存不足的情况,需按照堆内存治理的方式来进行解决,检查应用内存泄漏问题并优化,此情况不作为本次讨论的重点。本次主要讨论进程内运行的线程总数超过了系统的限制所导致的情况。出现此情况时,我们就需要通过控制并发的线程总数来解决这个问题。

大模型训练 307

50、安卓开发全攻略:从基础到实战

本文全面介绍了安卓开发的各个关键环节,涵盖从开发环境搭建、基础概念、数据处理与存储、界面布局设计,到动画与图形处理、事件与线程管理、多媒体处理等核心技术。同时深入探讨了应用的国际化支持、性能优化、安全权限管理、测试调试方法以及发布后的更新与维护策略。通过系统化的步骤指引和代码示例,帮助开发者从入门到实战,全面提升安卓应用开发能力。

melon的博客 64

Android线程管理之详解(线程创建、线程终止、线程同步、阻塞队列、线程池)

前言 总结一下Android上的线程管理,今天先来总结一下线程创建、线程终止、线程同步、阻塞队列、线程池使用。 一、线程创建 线程的创建包括三种方法,分别是继承自Thread,实现Runnable接口、实现Callback接口,前两个在开发中最为常见。 ①继承自Thread public class OneThread extends Thread { ...

P876643136的博客 3205

数字蓝牙功放

数字蓝牙功放(TPA3110+BK8000L),基于D类数字功放芯片TPA3116蓝牙功放,HIFI级带滤波15Wx2蓝牙数字功放,支持有线和蓝牙两种音源输入

runweipa的博客 1420

Qwen3.5本地部署实战:4B模型在RTX3060上离线运行指南

大语言模型本地化部署正从云端服务转向终端设备,其核心是模型轻量化、硬件适配与推理引擎协同优化。基于INT4量化感知训练和GGUF格式支持,Qwen3.5在结构精简、Tokenizer轻量及显存友好性方面显著优于前代,使4B级别模型可在RTX 3060等中端显卡上稳定运行。该技术路径兼顾低延迟响应(<2秒)、数据隐私保障与离线可用性,广泛适用于法律文书分析、医疗文档处理、教育AI助手等对安全性与实时性双重要求的场景。本文聚焦Qwen3.5-4B量化部署全流程,涵盖llama.cpp编译调优、GPU层加载策略及

weixin_32181267的博客 366

Android创建多线程并管理,Android性能优化—线程管理

什么是线程线程,有时被称为轻量级进程,是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针,寄存器集合和堆栈组成,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。每一个程序都至少有一个线程,若程序...

weixin_35851654的博客 490

基于Autoware制作高精地图(一)

基于Autoware制作高精地图(一) ​开始进入正题,也是最近在忙的一件事,制作高精地图。 高精地图的制作大概分为以下四个流程(不一定完全正确): 1.构建点云地图; 2.点云地图标注; 3.制作OpenDrive地图; 4.地图存储索引。 这篇文章主要讲解如何构建点云地图。 首先我们要有一段自己录制的激光雷达点云数据,这里推荐大家采用Velodyne16线激光雷达,因为这里我们构建的点云底图是三维的,而采用Velodyne而不是速腾聚创(rslidar)等其他品牌的原因是Autoware里面有一个选项是

weixin_44570248的博客 7800

Android之 线程详解

线程详解

qq_29848853的博客 3355

在Unity中为Sentis部署的YOLOv8模型集成NMS层并实现移动端性能优化

本文详细讲解了在Unity中利用Sentis部署YOLOv8模型时,如何通过代码动态集成NMS层以解决移动端性能瓶颈。文章核心在于避免导出时绑定NMS,转而使用Sentis原生API在运行时高效构建NMS处理流程,并分享了关键的GPU数据操作与移动端性能优化技巧,确保模型在移动设备上流畅运行。

p1q2r的博客 1095

简单的服务器取证

记一次入门服务器取证——药品直销网,涵盖旧版本宝塔、静态IP的配置更改、代码的理解

m0_74559567的博客 3756

Android 多线程、线程池

在异步请求中,Retrofit会自动将请求放在一个新的线程中执行,而在同步请求中,请求将在当前线程中执行。如果我们需要在请求中指定线程,可以使用Call接口的enqueue()方法的重载版本,该版本接受一个Callback对象和一个Executor对象作为参数,我们可以在Executor对象中指定线程池来执行请求。当我们执行异步任务时,任务的结果会在主线程中返回,并在主线程中处理。需要注意的是,如果我们在主线程中执行耗时操作,例如网络请求或数据库查询,会导致UI线程阻塞,从而导致应用程序响应性能下降。

QQ小冰 的博客 1332

Trae中配置和使用MCP 服务保姆级教程

您好,我是程序员夏叶,深度AI编程使用者,专注于分享AI编程方面的使用技巧和经验,有兴趣的可以关注我的公众号,一起学习,共同进步。从21号开始,Trae开始陆陆续续的灰度推送了一次新版本,有的用户是21号收到的更新,有的用户是22号收到的更新,本次更新我愿称之为王炸级更新,具体更新内容可以去看我的上一篇文章。本次更新其中的一个内容就是支持了MCP 服务,那么什么是MCP呢,它的全称是。

cpp加油站的专栏 8211

Android Upload Service 性能优化:内存管理和线程池配置详解

Android Upload Service 是一个功能强大的文件上传库,支持多部分上传、二进制上传和FTP上传。在实际应用中,合理的内存管理和线程池配置是确保上传服务稳定高效运行的关键因素。本文将深入探讨 Android Upload Service 的性能优化策略,特别是内存管理和线程池配置方面的最佳实践。 ## 🔍 理解 Android Upload Service 的架构 在开始性能

gitblog_00908的博客 837

40、5G NR射频要求解析

本文详细解析了5G NR射频相关要求,包括参考灵敏度与动态范围的定义、接收机对干扰信号的抗扰性要求(如阻塞、邻道选择性等)、辐射射频要求在FR1和FR2频段的差异,以及多标准无线电基站(MSR)的发展及其对射频要求的影响。内容涵盖测试模型、干扰场景、具体指标和实现挑战,为理解和应用5G NR射频规范提供了全面指导。

qsc901234的博客 245

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

安卓线程优先级管理与性能优化实践

线程调度是操作系统资源分配的核心机制,通过优先级系统决定CPU时间片的分配策略。在Android开发中,合理的线程优先级设置直接影响应用流畅度和响应速度。基于Linux内核的调度机制,Android通过Java层封装提供了1-10级的优先级控制,底层则映射到-20到19的nice值。掌握优先级映射关系对性能优化至关重要,特别是在处理UI渲染、音频播放等实时任务时。通过Android Studio Profiler、adb命令和编程API可以监控线程优先级,而不同场景(如网络请求、图片加载)需要采用差异化的优

weixin_29195615的博客 203

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

告别卡顿!Android UI性能优化实战:线程管理终极指南

在Android应用开发中,UI性能直接影响用户体验,而线程管理是优化UI性能的核心环节。本文将从线程模型、常见问题到实战优化方案,全面解析如何通过高效线程管理解决Android应用卡顿问题,提升界面流畅度。 ## 一、Android线程模型与UI卡顿根源 🧐 Android应用的主线程(UI线程)负责处理所有界面绘制和用户交互。当主线程被耗时操作阻塞超过16ms(对应60fps刷新率),就

gitblog_00074的博客 619

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Clean Architecture for Android性能优化终极指南:内存管理、线程调度与响应式编程实战

在Android应用开发中,性能优化是每个开发者必须面对的重要课题。Clean Architecture for Android项目通过其优雅的架构设计和最佳实践,为我们展示了如何在保持代码清晰可维护的同时,实现卓越的性能表现。本文将深入探讨基于Clean Architecture的Android应用在内存管理、线程调度和响应式编程方面的优化策略。 ## 🚀 Clean Architectur

gitblog_00653的博客 451

Android 性能优化<八> 多线程优化和线程管理

AsyncTask:为 UI 线程与工作线程之间进行快速的切换提供一种简单便捷的机制。适用于当下立即需要启动,但是异步执行的生命周期短暂的使用场景。 HandlerThread:为某些回调方法或者等待某些任务的执行设置一个专属的线程,并提供线程任务的调度机制。 ThreadPool:把任务分解成不同的单元,分发到各个不同的线程上,进行同时并发处理。 IntentService:适合于...

深南大盗的博客 1589

Java语言的移动应用性能优化

优化Java语言的移动应用性能需要开发者具备对应用内部工作机制的深入理解,并运用多种策略进行优化。随着技术的发展,新的优化工具和技术不断涌现,开发者应时刻保持对性能优化的关注,以提供更好的用户体验。在实际开发中,可以根据应用的特点灵活运用这些优化策略,从而打造高效且用户友好的移动应用。通过不断的测试与迭代,我们可以更好地满足用户的需求,提升应用的市场竞争力。

2501_91201177的博客 965

安卓应用层必知必会

梳理应用层必知必会。

xuanfengwuxiang的博客 205

Just-Another-Android-App性能优化:RxJava线程管理与内存泄漏防治

Just-Another-Android-App作为一个集成了多种主流Android开发库的基础应用,在复杂业务场景下的性能优化显得尤为重要。本文将聚焦RxJava的线程管理最佳实践和内存泄漏防治策略,帮助开发者构建更稳定高效的Android应用。 ## 🧵 RxJava线程管理的核心原则 RxJava作为响应式编程的核心库,其线程调度直接影响应用性能和用户体验。在Just-Another-

gitblog_00361的博客 321

Android 线程池使用

http://www.trinea.cn/android/java-android-thread-pool/http://blog.youkuaiyun.com/yaya_soft/article/details/24396357http://blog.youkuaiyun.com/carrey1989/article/details/12002033线程池使用说到线程池,平时主要用的是Thread跟AsyncTask,虽

主人公的专栏 1386

安卓应用性能优化的深度探索:从内存管理到布局优化

内存泄漏是指应用中已经不再使用的对象,由于某些原因仍然被其他对象持有引用,导致这些对象无法被垃圾回收器回收,从而占用内存空间。随着内存泄漏的积累,应用的可用内存逐渐减少,最终可能导致应用崩溃或性能严重下降。例如,一个 Activity 持有一个静态变量的引用,而该静态变量的生命周期比 Activity 长,当 Activity 销毁时,由于静态变量仍然引用着 Activity 中的对象,这些对象无法被回收,就造成了内存泄漏。在自定义 View 的开发过程中,应尽量简化绘制逻辑。

数字魔方操控师的博客 1830

自己总结的安卓面试题(一)

目录 安卓的多线程 Java基础知识 集合 网络相关面试题 性能优化 View相关 进程 其他的补充知识点 安卓的多线程 进程和线程的区别 进程是CPU资源分配的最小单位,线程的CPU调度的最小单位; 进程之间不能共享资源,线程之间可以共享所在进程的地址空间和资源; 一个进程中可以有多个线程,一个线程只能属于一个进程; 进程可以开启线程和其他进程 创建线程的三种方式 继承Thread类重写run方法; 实现Runnable接口重写run方法; 实现Ca

小Tian的博客 315
上一篇: 讲讲ArrayList
下一篇: Android性能优化—TraceView的使用
码农驿站
博客等级 码龄10年 5粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值