Android进阶 -- 避免创建不必要的对象

2023-12-24 12:18

本文主要是介绍Android进阶 -- 避免创建不必要的对象,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在内存调优的过程中,如何避免创建不必要的对象,一直是很重要的一个方面,下面来一起看看常用的避免创建对象的方法。

1.字符串的拼接

public static String buildString(String[] values) {String res = “”;for (String value : values) {res += values;}return res;
}

这是一段典型的拼接字符串的不友好写法,因为字符串的拼接,内部是生成StringBuilder对象,上面的写法会不断的生成StringBuilder对象。

要改善这种写法,可以在外部创建StringBuilder对象,然后在循环内部调用append方法进行拼接。

public static String buildString(String[] values) {StringBuilder res = new StringBuilder();for (String value : values) {res.append(value);}return res.toString();
}

同时对于既定格式的字符串,可以使用String.format避免创建过多的对象。

2.单例模式
不熟悉单例模式的小伙伴可以看这篇文章
单例模式

3.减少布局的层级
注意布局的设计、<merge> <include> <ViewStub>标签的应用以及自定义View的使用,布局层级过多,不仅导致inflate过程耗时,对于内存的开销也会增大。

4.注意多线程的使用
在Android开发中,由于UI线程不能执行耗时的任务,所以常常会使用多线程来辅助开发,但是单独创建线程的开销其实是不小的,建议多使用HandlerThread或者ThreadPool来优化内存的开销。

5.使用注解代替枚举
枚举使用起来确实很方便,但是枚举的实质还是创建对象,Android内置了相关的注解,在开发过程中可以使用注解来代替枚举。

public class Test {public static final int BOY = 0;public static final int GIRL = 1;public static final int UN_KNOW = 2;@IntDef({BOY, GIRL, UN_KNOW})@Retention(RetentionPolicy.SOURCE)public @interface sex{}public static String getSex(@Test.sex int sex) {switch (sex) {case BOY:return "BOY";case GIRL:return "GIRL";case UN_KNOW:return "UnKnow";}return "";}
}

这样写的好处一是静态常量相比与枚举节省了近一半的内存,二是使用注解限定和提示调用者的传入参数,提高代码的可读性。

6.避免进行隐式装箱
例如

Integer sum = 0;
for(int i=0; i<100; i++){sum+=i;
}


因为sum为Integer类型的,在执行的过程中会生成100个无用的对象。
同时在把原始类型数据加入集合中时,也会发生装箱,在Android中可以使用SparseArray来避免装箱。

7.选用对象池
非常常见的一个应用就是Handler.Message
虽然可以使用Message msg = new Message(),但是用Message msg = handler.obtainMessage()可以节省内存的开销。

 

这篇关于Android进阶 -- 避免创建不必要的对象的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/531740

相关文章

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

Spring创建Bean的八种主要方式详解

《Spring创建Bean的八种主要方式详解》Spring(尤其是SpringBoot)提供了多种方式来让容器创建和管理Bean,@Component、@Configuration+@Bean、@En... 目录引言一、Spring 创建 Bean 的 8 种主要方式1. @Component 及其衍生注解

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

Python进阶之列表推导式的10个核心技巧

《Python进阶之列表推导式的10个核心技巧》在Python编程中,列表推导式(ListComprehension)是提升代码效率的瑞士军刀,本文将通过真实场景案例,揭示列表推导式的进阶用法,希望对... 目录一、基础语法重构:理解推导式的底层逻辑二、嵌套循环:破解多维数据处理难题三、条件表达式:实现分支

MySQL 数据库表操作完全指南:创建、读取、更新与删除实战

《MySQL数据库表操作完全指南:创建、读取、更新与删除实战》本文系统讲解MySQL表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据

基于Python编写自动化邮件发送程序(进阶版)

《基于Python编写自动化邮件发送程序(进阶版)》在数字化时代,自动化邮件发送功能已成为企业和个人提升工作效率的重要工具,本文将使用Python编写一个简单的自动化邮件发送程序,希望对大家有所帮助... 目录理解SMTP协议基础配置开发环境构建邮件发送函数核心逻辑实现完整发送流程添加附件支持功能实现htm

MySQL 临时表创建与使用详细说明

《MySQL临时表创建与使用详细说明》MySQL临时表是存储在内存或磁盘的临时数据表,会话结束时自动销毁,适合存储中间计算结果或临时数据集,其名称以#开头(如#TempTable),本文给大家介绍M... 目录mysql 临时表详细说明1.定义2.核心特性3.创建与使用4.典型应用场景5.生命周期管理6.注

MySQL的触发器全解析(创建、查看触发器)

《MySQL的触发器全解析(创建、查看触发器)》MySQL触发器是与表关联的存储程序,当INSERT/UPDATE/DELETE事件发生时自动执行,用于维护数据一致性、日志记录和校验,优点包括自动执行... 目录触发器的概念:创建触www.chinasem.cn发器:查看触发器:查看当前数据库的所有触发器的定

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按