你可能需要了解下的Android開發技巧(二)
highlight: vs theme: devui-blue
持續創作,加速成長!這是我參與「掘金日新計劃 · 10 月更文挑戰」的第5天,點擊查看活動詳情
本篇是介紹Android常見開發技巧的第二篇,內容比較雜: 1. 判斷是否為主線程
字符串比較
穩定
值在前避免濫用官方
isVisible
擴展屬性希望能給你帶來幫助。
歷史文章
判斷是否為主線程
kotlin
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
註解
java
public boolean compare(@NotNull String content) {
return content.equals(KEY_1);
}
這樣還是有一個安全隱患,外部就是傳null了你能怎麼辦?
- 增加是否為空校驗
java
public boolean compare(String content) {
if (TextUtils.isEmpty(content)) {
return false;
}
return content.equals(KEY_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代碼看下:
方法體非常大,本來不使用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)常用的一些技巧,不管是瞭解還是使用都很簡單,希望能給各位日常開發帶來幫助。
- kotlin密封sealed class/interface的迭代之旅
- 2022年12月12日—2022年12月25日Android精品文章一覽
- Sqlite簡易性能優化方案,給你的應用插上“翅膀”
- 築基篇:設置界面的開發利器Preference Library,瞭解一下~
- Android消息機制完整的執行流程,瞭解一下
- 你可能需要了解下的Android開發技巧(二)
- 超有用的Android開發技巧:攔截界面View創建
- Handler創建的幾個必備知識點,瞭解一下
- Android消息機制中Message常用的幾種監控方式
- 數見不鮮的RecyclerView使用技巧,你瞭解嗎(一)?
- 常用到的幾個Kotlin開發技巧,減少對業務層代碼的入侵
- 超好用的官方core-ktx庫,瞭解一下(終)~
- Take a look,從delay()方法看協程的掛起與恢復
- 超好用的官方core-ktx庫,瞭解一下~
- 官方core-ktx庫能對SparseArray系列、Pair開發帶來哪些便利?
- 官方core-ktx庫能對富文本Span開發帶來哪些便利2
- 你需要了解的官方core-ktx庫能對開發帶來哪些便利1
- LeakCanary如何監聽Fragment、Fragment View、ViewModel銷燬時機?
- 非反射動態設置TabLayout指示器的寬度
- 探究EventBus粘性事件實現機制