你可能需要了解下的Android開發技巧(二)

語言: CN / TW / HK

highlight: vs theme: devui-blue


持續創作,加速成長!這是我參與「掘金日新計劃 · 10 月更文挑戰」的第5天,點擊查看活動詳情

本篇是介紹Android常見開發技巧的第二篇,內容比較雜: 1. 判斷是否為主線程

  1. 字符串比較穩定值在前

  2. 避免濫用官方isVisible擴展屬性

希望能給你帶來幫助。

歷史文章

你可能需要了解下的Android開發技巧(一)

判斷是否為主線程

kotlin 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註解

java public boolean compare(@NotNull String content) { return content.equals(KEY_1); }

這樣還是有一個安全隱患,外部就是傳null了你能怎麼辦?

  1. 增加是否為空校驗

java public boolean compare(String content) { if (TextUtils.isEmpty(content)) { return false; } return content.equals(KEY_1); }

這麼寫一定沒什麼毛病 ,即使有些太麻煩了。

  1. 調換比較的位置,穩定值在前

java public boolean compare(String content) { return KEY_1.equals(content); }

由於KEY_1是一個常量,一定不可能為null,那麼調用其equals()自然不會產生什麼異常,而且代碼寫起來也非常簡單。

避免濫用官方isVisible擴展屬性

大家應該都知道,官方core-ktx庫提供了擴展屬性:

kotlin 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,所以很可能會寫出下面代碼:

kotlin 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顯隱的擴展方法:

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

總結

本篇文章主要是介紹了Android開發中(包括Kotlin)常用的一些技巧,不管是瞭解還是使用都很簡單,希望能給各位日常開發帶來幫助。