你可能需要了解下的Android开发技巧(二)

1,963 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情

本篇是介绍Android常见开发技巧的第二篇,内容比较杂:

  1. 判断是否为主线程

  2. 字符串比较稳定值在前

  3. 避免滥用官方isVisible扩展属性

希望能给你带来帮助。

历史文章

你可能需要了解下的Android开发技巧(一)

判断是否为主线程

val isMainThread: Boolean get() = Looper.getMainLooper().thread === Thread.currentThread()

简单明了,主要是Looper在创建时会绑定当前所在的线程,而主线程的Looper我们又会保存到LoopersMainLooper全局变量中。

字符串比较稳定值在前

比如当前有这么一个类,实现了一个比较函数:

public class GM1 {

    private static final String KEY_1 = "GM1";
    
    public boolean compare(String content) {
        return content.equals(KEY_1);
    }
}

这样写看起来有什么毛病吗?有,有空指针异常的安全隐患,比如你怎么知道content这个参数是否为null呢?知道了问题所在,我们有三种解决方式:

  1. 不允许空加一个@NotNull注解
public boolean compare(@NotNull  String content) {
    return content.equals(KEY_1);
}

这样还是有一个安全隐患,外部就是传null了你能怎么办?

  1. 增加是否为空校验
public boolean compare(String content) {
    if (TextUtils.isEmpty(content)) {
        return false;
    }
    return content.equals(KEY_1);
}

这么写一定没什么毛病 ,即使有些太麻烦了。

  1. 调换比较的位置,稳定值在前
public boolean compare(String content) {
    return KEY_1.equals(content);
}

由于KEY_1是一个常量,一定不可能为null,那么调用其equals()自然不会产生什么异常,而且代码写起来也非常简单。

避免滥用官方isVisible扩展属性

大家应该都知道,官方core-ktx库提供了扩展属性:

public inline var View.isVisible: Boolean
    get() = visibility == View.VISIBLE
    set(value) {
        visibility = if (value) View.VISIBLE else View.GONE
    }

这样大家会更加方便操作View显隐,比如mbinding.tv.isVisible = false,所以很可能会写出下面代码:

fun test(isShow: Boolean) {
    mBinding.tv.isVisible = isShow
    mBinding.flagTv.isVisible = isShow
    mBinding.contentTv.isVisible = isShow
    mBinding.titleTv.isVisible = isShow
    mBinding.iconTv.isVisible = isShow
}

看起来有什么毛病吗?有而且非常大,上面这几个View的显隐都是由同一个变量isShow控制,显隐同命,使用kotlin写起来看起来很简洁,但这个地方调用了isVisible方法,相当于写了五个三元操作符来判断isShow从而控制View显隐,我们可以反编译成java代码看下:

image.png image.png

方法体非常大,本来不使用isVisible一个if-else就能搞定了,为了使用官方的扩展属性而使用,导致了这个现状,所以大家不要因为是官方提供的就滥用isVisible扩展属性。

这里提供给大家一个支持根据一个变量操作多个View显隐的扩展方法:

fun Boolean.isShow(vararg views: View) {
    if (this) {
        views.forEach {
            it.visibility = View.VISIBLE
        }
    } else {
        views.forEach {
            it.visibility = View.GONE
        }
    }
}

总结

本篇文章主要是介绍了Android开发中(包括Kotlin)常用的一些技巧,不管是了解还是使用都很简单,希望能给各位日常开发带来帮助。