持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情
本篇是介绍Android常见开发技巧的第二篇,内容比较杂:
判断是否为主线程
字符串比较
稳定
值在前避免滥用官方
isVisible
扩展属性希望能给你带来帮助。
历史文章
判断是否为主线程
val isMainThread: Boolean get() = Looper.getMainLooper().thread === Thread.currentThread()
简单明了,主要是Looper
在创建时会绑定当前所在的线程,而主线程的Looper
我们又会保存到Looper
的sMainLooper
全局变量中。
字符串比较稳定
值在前
比如当前有这么一个类,实现了一个比较函数:
public class GM1 {
private static final String KEY_1 = "GM1";
public boolean compare(String content) {
return content.equals(KEY_1);
}
}
这样写看起来有什么毛病吗?有,有空指针异常的安全隐患,比如你怎么知道content
这个参数是否为null呢?知道了问题所在,我们有三种解决方式:
- 不允许空加一个
@NotNull
注解
public boolean compare(@NotNull String content) {
return content.equals(KEY_1);
}
这样还是有一个安全隐患,外部就是传null了你能怎么办?
- 增加是否为空校验
public boolean compare(String content) {
if (TextUtils.isEmpty(content)) {
return false;
}
return content.equals(KEY_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代码看下:
方法体非常大,本来不使用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)常用的一些技巧,不管是了解还是使用都很简单,希望能给各位日常开发带来帮助。