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

相关文章

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

Python创建Excel的4种方式小结

《Python创建Excel的4种方式小结》这篇文章主要为大家详细介绍了Python中创建Excel的4种常见方式,文中的示例代码简洁易懂,具有一定的参考价值,感兴趣的小伙伴可以学习一下... 目录库的安装代码1——pandas代码2——openpyxl代码3——xlsxwriterwww.cppcns.c

使用Python在Excel中创建和取消数据分组

《使用Python在Excel中创建和取消数据分组》Excel中的分组是一种通过添加层级结构将相邻行或列组织在一起的功能,当分组完成后,用户可以通过折叠或展开数据组来简化数据视图,这篇博客将介绍如何使... 目录引言使用工具python在Excel中创建行和列分组Python在Excel中创建嵌套分组Pyt

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

JSON字符串转成java的Map对象详细步骤

《JSON字符串转成java的Map对象详细步骤》:本文主要介绍如何将JSON字符串转换为Java对象的步骤,包括定义Element类、使用Jackson库解析JSON和添加依赖,文中通过代码介绍... 目录步骤 1: 定义 Element 类步骤 2: 使用 Jackson 库解析 jsON步骤 3: 添

MySQL分表自动化创建的实现方案

《MySQL分表自动化创建的实现方案》在数据库应用场景中,随着数据量的不断增长,单表存储数据可能会面临性能瓶颈,例如查询、插入、更新等操作的效率会逐渐降低,分表是一种有效的优化策略,它将数据分散存储在... 目录一、项目目的二、实现过程(一)mysql 事件调度器结合存储过程方式1. 开启事件调度器2. 创