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

相关文章

JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)

《JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)》:本文主要介绍如何在IntelliJIDEA2020.1中创建和部署一个JavaWeb项目,包括创建项目、配置Tomcat服务... 目录简介:一、创建项目二、tomcat部署1、将tomcat解压在一个自己找得到路径2、在idea中添加

Java利用Spire.Doc for Java实现在模板的基础上创建Word文档

《Java利用Spire.DocforJava实现在模板的基础上创建Word文档》在日常开发中,我们经常需要根据特定数据动态生成Word文档,本文将深入探讨如何利用强大的Java库Spire.Do... 目录1. Spire.Doc for Java 库介绍与安装特点与优势Maven 依赖配置2. 通过替换

Android使用java实现网络连通性检查详解

《Android使用java实现网络连通性检查详解》这篇文章主要为大家详细介绍了Android使用java实现网络连通性检查的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录NetCheck.Java(可直接拷贝)使用示例(Activity/Fragment 内)权限要求

2025最新版Android Studio安装及组件配置教程(SDK、JDK、Gradle)

《2025最新版AndroidStudio安装及组件配置教程(SDK、JDK、Gradle)》:本文主要介绍2025最新版AndroidStudio安装及组件配置(SDK、JDK、Gradle... 目录原生 android 简介Android Studio必备组件一、Android Studio安装二、A

MySQL 数据库进阶之SQL 数据操作与子查询操作大全

《MySQL数据库进阶之SQL数据操作与子查询操作大全》本文详细介绍了SQL中的子查询、数据添加(INSERT)、数据修改(UPDATE)和数据删除(DELETE、TRUNCATE、DROP)操作... 目录一、子查询:嵌套在查询中的查询1.1 子查询的基本语法1.2 子查询的实战示例二、数据添加:INSE

java创建xls文件放到指定文件夹中实现方式

《java创建xls文件放到指定文件夹中实现方式》本文介绍了如何在Java中使用ApachePOI库创建和操作Excel文件,重点是如何创建一个XLS文件并将其放置到指定文件夹中... 目录Java创建XLS文件并放到指定文件夹中步骤一:引入依赖步骤二:创建XLS文件总结Java创建XLS文件并放到指定文件

mysql笛卡尔积怎么形成以及怎么避免笛卡尔积详解

《mysql笛卡尔积怎么形成以及怎么避免笛卡尔积详解》笛卡尔积是指两个集合中所有可能的有序对的集合,在数据库中它表示两个表的每一行都与另一个表的每一行组合,:本文主要介绍mysql笛卡尔积怎么形成... 目录第一部分:什么是笛卡尔积,它是如何形成的?1. 定义2. 在 mysql 中如何形成3. 笛卡尔积的

sqlserver、mysql、oracle、pgsql、sqlite五大关系数据库的对象名称和转义字符

《sqlserver、mysql、oracle、pgsql、sqlite五大关系数据库的对象名称和转义字符》:本文主要介绍sqlserver、mysql、oracle、pgsql、sqlite五大... 目录一、转义符1.1 oracle1.2 sqlserver1.3 PostgreSQL1.4 SQLi

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV