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

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

[MySQL表的增删改查-进阶]

🌈个人主页:努力学编程’ ⛅个人推荐: c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 💻💻💻数据库约束 🔭🔭🔭约束类型 not null: 指示某列不能存储 NULL 值unique: 保证某列的每行必须有唯一的值default: 规定没有给列赋值时的默认值.primary key:

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。