如何利用Kotlin實(shí)現(xiàn)極簡(jiǎn)回調(diào)
前言
在各種開發(fā)場(chǎng)景中,回調(diào)都有著廣泛的應(yīng)用,命名往往是各種Callback和Listener,其中在Android中接觸最早也最常用的可能就是View.OnClickListener了。
mBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("MM","Click");
}
});
不過寫多了也有點(diǎn)煩惱,我只想打印一條日志,卻寫了這么多代碼。不過好在這個(gè)接口里面只包含一個(gè)方法,但換做一些包含方法數(shù)量比較多的回調(diào)就顯得比較臃腫了:
mEdit.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
如果你想優(yōu)化你的代碼,讓它們看起來更簡(jiǎn)潔優(yōu)雅,可以試試Kotlin的中的一些方法。
簡(jiǎn)化
先來看下Kotlin中的回調(diào):
mBtn.setOnClickListener(object :View.OnClickListener{
override fun onClick(v: View?) {
println("Click")
}
})
好像一點(diǎn)也沒簡(jiǎn)化嘛,不過因?yàn)樵?Kotlin 里函數(shù)也是參數(shù)的一種,在 Java 中只包含一個(gè)方法的接口,在 Kotlin 中都可以使用 Lambda 表達(dá)式來達(dá)成一樣的效果。
mBtnCallback.setOnClickListener { println("Click") }
是不是簡(jiǎn)單很多了,但上面的用法僅適用于接口中只有一個(gè)方法的情況,如果存在多個(gè)方法的話,當(dāng)然也可以簡(jiǎn)化了:
mEdit.addTextChangedListener {
beforeTextChanged { text, start, count, after -> println("beforeTextChanged") }
onTextChanged { text, start, before, count -> println("onTextChanged") }
afterTextChanged { text -> println("afterTextChanged") }
}
也可以按需調(diào)用其中任意個(gè)方法:
mEdit.addTextChangedListener {
onTextChanged { text, start, before, count -> println("onTextChanged") }
}
不過此處的addTextChangedListener是一個(gè)擴(kuò)展函數(shù),需要我們來自己實(shí)現(xiàn):
inline fun TextView.addTextChangedListener(init: TextWatcherBridge.() -> Unit) = addTextChangedListener(TextWatcherBridge().apply(init))
class TextWatcherBridge : TextWatcher {
private var beforeTextChanged: ((CharSequence?, Int, Int, Int) -> Unit)? = null
private var onTextChanged: ((CharSequence?, Int, Int, Int) -> Unit)? = null
private var afterTextChanged: ((Editable?) -> Unit)? = null
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
beforeTextChanged?.invoke(s, start, count, after)
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
onTextChanged?.invoke(s, start, before, count)
}
override fun afterTextChanged(s: Editable?) {
afterTextChanged?.invoke(s)
}
fun beforeTextChanged(listener: (CharSequence?, Int, Int, Int) -> Unit) {
beforeTextChanged = listener
}
fun onTextChanged(listener: (CharSequence?, Int, Int, Int) -> Unit) {
onTextChanged = listener
}
fun afterTextChanged(listener: (Editable?) -> Unit) {
afterTextChanged = listener
}
}
原理就是實(shí)現(xiàn)一個(gè)擴(kuò)展函數(shù),把我們自己實(shí)現(xiàn)的TextWatcherBridge加入到回調(diào)中,因?yàn)镵otlin支持函數(shù)式編程,里面都是高階函數(shù)。為了減少性能損耗,擴(kuò)展函數(shù)聲明為內(nèi)聯(lián)函數(shù)。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Android仿微信QQ聊天頂起輸入法不頂起標(biāo)題欄的問題
這篇文章主要介紹了Android之仿微信QQ聊天頂起輸入法不頂起標(biāo)題欄問題,本文實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11
Android 側(cè)滑抽屜菜單的實(shí)現(xiàn)代碼
這篇文章主要介紹了Android 側(cè)滑抽屜菜單的實(shí)現(xiàn)代碼,本文通過實(shí)例圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
Kotlin語言使用BroadcastReceiver示例介紹
Android開發(fā)的四大組件分別是:活動(dòng)(activity),用于表現(xiàn)功能;服務(wù)(service),后臺(tái)運(yùn)行服務(wù),不提供界面呈現(xiàn);廣播接受者(Broadcast Receive),勇于接收廣播;內(nèi)容提供者(Content Provider),支持多個(gè)應(yīng)用中存儲(chǔ)和讀取數(shù)據(jù),相當(dāng)于數(shù)據(jù)庫,本篇著重介紹廣播組件2022-09-09
Android編程實(shí)現(xiàn)播放視頻的方法示例
這篇文章主要介紹了Android編程實(shí)現(xiàn)播放視頻的方法,結(jié)合具體實(shí)例形式分析了Android使用VideoView類播放視頻的相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2017-08-08
內(nèi)存泄漏檢測(cè)工具LeakCanary源碼解析
這篇文章主要為大家介紹了內(nèi)存泄漏檢測(cè)工具LeakCanary源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
Android實(shí)現(xiàn)朋友圈點(diǎn)贊列表
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)朋友圈點(diǎn)贊列表,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11
Kotlin實(shí)現(xiàn)半圓形進(jìn)度條的方法示例
這篇文章主要給大家介紹了關(guān)于Kotlin實(shí)現(xiàn)半圓形進(jìn)度條的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03
Android開發(fā)中requestfocus()無效的原因及解決辦法
這篇文章主要介紹了Android開發(fā)中requestfocus()無效的原因及解決辦法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08

