玩安卓必须要掌握的性能优化之内存优化

简介: 玩安卓必须要掌握的性能优化之内存优化

前言

这是我写的性能优化的第三篇文章,下面是另外两篇文章:

玩安卓必须要掌握的性能优化之内存泄漏

玩安卓必须要掌握的性能优化之APK极限压缩

正文

本篇文章准备详细说一下编码中需要注意的地方,养成良好的编码习惯。

第一点 数据类型

尽量不要使用比需求更占空间的基本数据类型,比如能用 int 就不使用 long,能用 float 就不使用 double,可以减少内存的开销,虽然几乎对程序产生不了太大影响,但是还是要尽量避免。

还有就是自动装箱尽量少用。

第二点 循环

循环尽量使用增强for循环(for each),少用迭代器(iterator)

第三点 数据结构与算法

这一点是最重要的,但也是最难的,其实也不难,关键看能不能坚持下来。每天看一道算法题,半年基本上就能提升非常大的一截。数组、链表、树、栈、图。。。。

还有一点是咱们经常使用的HashMap,写的时候非常自然,直接就写出来了,但是占用内存较大,Android官方为安卓开发者提供了SparseArray(key为整数),当数据量在千级以下可以使用,它的性能虽然不如HashMap但节约内存;千级以上还是使用我们熟悉的HashMap吧。

第四点 枚举优化

曾几何时,因为安卓官方二点几的一句话(图在下方),几乎所有的安卓性能优化中都会有这么一句,但我想说的是,随着硬件的提升,之后的官方文档中早已经找不见这句话了

20200224221253162.png

虽然说现在可以用枚举,但是性能优化嘛,本来也就是鸡蛋里挑骨头,咱们可以将枚举替换成常量,并用注解进行个数的限制。下面是代码样例:

public class Constants {
    public static final String TYPE_A = "1";
    public static final String TYPE_B = "2";
    public static final String TYPE_C = "3";
    public static final int TYPEDES_A = 1;
    public static final int TYPEDES_B = 2;
    public static final int TYPEDES_C = 3;
}
//String类型的注解 @StringDef() 
@StringDef({Constants.TYPE_A,Constants.TYPE_B,Constants.TYPE_C})
public @interface FieldMata {
}
//int类型的注解
@IntDef({Constants.TYPEDES_A,Constants.TYPEDES_B,Constants.TYPEDES_C})
public @interface TypeDes {
}

代码很简单,使用也不难,下面是使用样例:

//在需要限定的方法内的参数写上先前定义的限定值
    private void printType(@FieldMata String type) {
        System.out.println(type);
    }
    private void printType(@TypeDes int des) {
        System.out.println(des);
    }
    public static void main(String[] args) {
        DemoTest demoTest = new DemoTest();
        demoTest.printType(Constants.TYPE_A);
        demoTest.printType(Constants.TYPEDES_A);
    }

第五点 static   static final的问题

static会由编译器调用clinit方法进行初始化

static final不需要进行初始化工作,打包在dex文件中可以直接调用,并不会在类初始化申请内存

所以基本数据类型的成员,可以全写成static final

第六点 字符串的连接尽量少用加号(+)

这一点大家可能听的耳朵都起茧了,但是不得不说,几次拼接可能无所谓,但是千万不要在循环中还使用加号进行拼接,对内存的消耗真的挺大,尽量还是使用StringBuffer和StringBuilder吧。

第七点 重复申请内存问题

尽量不要在同一个方法多次调用,如递归函数 ,回调函数中new对象,读流直接在循环中new对象等

也不要在onMeause() 、onLayout()、onDraw()  中去刷新UI(requestLayout)

第八点 避免GC回收将来要重用的对象

比如咱们最常用的图片加载框架Glide,它就做的非常好,既实现了LifeCycle,还使用Lru算法,还有三级缓存,这样大大避免了GC回收需要重复使用的图片,可以参考Glide源码的实现。

第九点 尽量使用IntentService,而不是Service

原因很简单,IntentService是一个异步的,会自动停止的服务,很好解决了传统的Service中处理完耗时操作忘记停止并销毁Service的问题。

第十点 Activity组件泄漏

非业务需要不要把activity的上下文做参数传递,可以传递application的上下文

千万不要把和Activity有关联的对象写成static   如private static Button btn;   private static Drawable drawable;除了调用比较方便,没有一点好处

非静态内部类和匿名内部内会持有activity引用。比如咱们经常写的回调接口,不要使用匿名内部类来实现,尽量使用实现接口的方式来实现,在接收的使用也尽量不要接收Activity,最好使用弱引用(WeakReference),但是别忘了在使用前要进行判空

单例模式持有activity引用,这里也是,如果需要Activity尽量使用弱引用

handler.postDelayed(),如果开启的线程需要传入参数,用弱引接收可解决问题。还有就是handler记得清除removeCallbacksAndMessages(null)

总结

其实上面所说的只是很多编码习惯中比较重要的一些,当然还有很多没有列举出来。


目录
相关文章
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
1384 4
|
算法 数据处理 Android开发
掌握安卓性能优化的秘诀:电池寿命与运行效率的提升
【10月更文挑战第6天】 本文深入探讨了安卓应用开发中的性能优化技巧,重点分析了影响电池寿命和运行效率的关键因素,并提供了针对性的优化策略。通过代码优化、资源管理、后台任务处理等方法,开发者可以显著提升应用的续航能力和流畅度。同时,结合具体案例,展示了如何在实际开发中应用这些技巧,确保应用在各种场景下都能保持高效运行。本文旨在为安卓开发者提供实用的性能优化指导,助力其打造更优质的应用体验。
517 2
|
网络协议 Linux Android开发
深入探索Android系统架构与性能优化
本文旨在为读者提供一个全面的视角,以理解Android系统的架构及其关键组件。我们将探讨Android的发展历程、核心特性以及如何通过有效的策略来提升应用的性能和用户体验。本文不包含常规的技术细节,而是聚焦于系统架构层面的深入分析,以及针对开发者的实际优化建议。
408 21
|
Java Android开发 UED
安卓应用开发中的内存管理优化技巧
在安卓开发的广阔天地里,内存管理是一块让开发者既爱又恨的领域。它如同一位严苛的考官,时刻考验着开发者的智慧与耐心。然而,只要我们掌握了正确的优化技巧,就能够驯服这位考官,让我们的应用在性能和用户体验上更上一层楼。本文将带你走进内存管理的迷宫,用通俗易懂的语言解读那些看似复杂的优化策略,让你的开发之路更加顺畅。
382 33
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
266 5
|
Android开发 开发者
Android性能优化——内存管理的艺术
Android性能优化——内存管理的艺术
|
缓存 数据库 Android开发
安卓开发中的性能优化技巧
【10月更文挑战第29天】在移动应用的海洋中,性能是船只能否破浪前行的关键。本文将深入探讨安卓开发中的性能优化策略,从代码层面到系统层面,揭示如何让应用运行得更快、更流畅。我们将以实际案例和最佳实践为灯塔,引领开发者避开性能瓶颈的暗礁。
354 3
|
存储 缓存 监控
|
存储 算法 Java
Java虚拟机(JVM)的内存管理与性能优化
本文深入探讨了Java虚拟机(JVM)的内存管理机制,包括堆、栈、方法区等关键区域的功能与作用。通过分析垃圾回收算法和调优策略,旨在帮助开发者理解如何有效提升Java应用的性能。文章采用通俗易懂的语言,结合具体实例,使读者能够轻松掌握复杂的内存管理概念,并应用于实际开发中。
|
存储 缓存 网络协议
5个Android性能优化相关的深度面试题
本文涵盖五个Android面试题及其解答,包括优化应用启动速度、内存泄漏的检测与解决、UI渲染性能优化、减少内存抖动和内存溢出、优化网络请求性能。每个问题都提供了详细的解答和示例代码。
404 2

热门文章

最新文章