android——开发中哪些习惯会影响卡顿的发生、如何提高代码健壮性(稳定性)

文章讲述了如何利用Kotlin特性增强代码的健壮性和稳定性,包括减少空指针、避免强转换、使用数据类和扩展函数等。同时,提出了优化Android应用性能的建议,如简化布局、避免主线程耗时操作、减少过度绘制以及列表优化等。

一、kotlin提高代码的健壮性(稳定性)

1、减少空指针
  • 减少定义null属性,可以使用lateinit,或者lazy的形式:private val mAdapter by lazy { ArticleAdapter() }

  • Int类型定义默认0,string类型定义默认为""等

  • 定义不为空的变量需要在构造函数或者 init 代码块里赋值

  • private var gif: ImageView? = null这种类型的空定义怎么避免呢?可以参考玩安卓--我的界面MineFragment里的代码来避免(主要通过mBinding来避免)

2、减少强转换造成的异常
  • 用泛型来替代,尽量少使用强转换

  • A as B这样用会有隐患,导致crash,改成if(A is B){}这种方式

3、控件的id命名要唯一

尽量保证控件id的命名唯一,保证按下ctl+鼠标左键 ,能定位到唯一的控件,这点在多个页面的时候可以为你省下很多不小心带来的错误

4、使用数据类

使用数据类可以简化代码,避免因手动编写 getter 和 setter 方法而出现的误差。

5、使用扩展函数

使用 Kotlin 中的扩展函数可以更好地抽象出通用的逻辑,避免重复编写相同的功能。

6、 Lambda 表达式和高阶函数

使用 Lambda 表达式和高阶函数可以更好地处理函数指针和函数式编程,提高代码的可读性和可维护性。

7、使用函数式异常处理机制

Kotlin 中的异常处理机制比 Java 更方便,可以使用 try、catch 和 finally 块,来更好地处理程序运行时出现的异常。

8、使用合适的集合和算法

在 Kotlin 中,使用合适的集合类型和算法能够帮助你更好地处理数据,提高代码的效率和稳定性。

9、使用单元测试和前期测试

使用单元测试和前期测试可以及早发现代码中的错误,避免在应用程序发布后出现问题。

二、开发中哪些习惯会影响卡顿的发生,如下:

1.布局太乱,层级太深。

  • 1.1:通过减少冗余或者嵌套布局来降低视图层次结构。比如使用约束布局代替线性布局和相对布局。

  • 1.2:用 ViewStub 替代在启动过程中不需要显示的 UI 控件。

  • 1.3:使用自定义 View 替代复杂的 View 叠加。

  • 1.4:使用可空类型和空安全操作符:在 Kotlin 中,使用可空类型(如 String?)可以帮助你在代码中标识空值。与此同时,使用空安全操作符(?.、?:)可以更好地处理这些值,以避免出现空指针异常。

2.主线程耗时操作

  • 2.1:主线程中不要直接操作数据库,数据库的操作应该放在数据库线程中完成。

  • 2.2:sharepreference尽量使用apply,少使用commit,可以使用MMKV框架来代替sharepreference。

  • 2.3:网络请求回来的数据解析尽量放在子线程中,不要在主线程中进行复制的数据解析操作。

  • 2.4:不要在activity的onResume和onCreate中进行耗时操作,比如大量的计算等。

  • 2.5:不要在 draw 里面调用耗时函数,不能 new 对象

3.过度绘制

过度绘制是同一个像素点上被多次绘制,减少过度绘制一般减少布局背景叠加等方式,如下图所示右边是过度绘制的图片。

4.列表

RecyclerView使用优化,使用DiffUtil和notifyItemDataSetChanged进行局部更新等。

5.对象分配和回收优化

自从Android引入 ART 并且在Android 5.0上成为默认的运行时之后,对象分配和垃圾回收(GC)造成的卡顿已经显著降低了,但是由于对象分配和GC有额外的开销,它依然又可能使线程负载过重。 在一个调用不频繁的地方(比如按钮点击)分配对象是没有问题的,但如果在在一个被频繁调用的紧密的循环里,就需要避免对象分配来降低GC的压力。

减少小对象的频繁分配和回收操作

三、项目中的卡顿优化(实战)

点击按钮跳转到另外一个activity时,卡顿了差不多两秒才显示出来。

优化方向:找到造成卡顿的代码,使用handler或者livedata来运行,目的:先让activity显示出来,再运行卡顿的代码,示例:

Handler handler = new Handler(Looper.getMainLooper()); // 使用handler目的是先显示ui再去运行初始化
handler.post(() -> {
    // 这里是卡顿的代码 begin
    recognizeViewModel.init();
    initRgbCamera();
    if (DualCameraHelper.hasDualCamera() && livenessType == LivenessType.IR) {
        initIrCamera();
    }
    // 这里是卡顿的代码 end
    handler.removeCallbacksAndMessages(null);
});

使用livedata的方式会更好,这里省略示例代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wy313622821

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值