Kotlin-SingleLiveEvent 定义与使用

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import java.util.concurrent.atomic.AtomicBoolean
 
// 定义SingleLiveEvent
class SingleLiveEvent<T> : MutableLiveData<T>() {
 
    private val pending = AtomicBoolean(false)
 
    @MainThread
    override fun setValue(t: T?) {
        pending.set(true)
        super.setValue(t)
    }
 
    @MainThread
    override fun postValue(value: T?) {
        pending.set(true)
        super.postValue(value)
    }
 
    @MainThread
    fun observe(owner: LifecycleOwner, observer: Observer<in T>) {
        if (hasActiveObservers()) {
            Log.w("SingleLiveEvent", "Multiple observers registered but only one will receive event.")
        }
        
        super.observe(owner, Observer {
            if (pending.compareAndSet(true, false)) {
                observer.onChanged(it)
            }
        })
    }
}
 
// 使用SingleLiveEvent的ViewModel
class MyViewModel : ViewModel() {
    // 定义SingleLiveEvent来发送UI事件
    private val _showSnackbarEvent = SingleLiveEvent<String>()
    val showSnackbarEvent: LiveData<String> get() = _showSnackbarEvent
 
    fun doSomething() {
        // ... 执行一些操作
        _showSnackbarEvent.value = "Operation completed"
    }
}
 
// 在Activity或Fragment中观察SingleLiveEvent
myViewModel.showSnackbarEvent.observe(this, Observer { message ->
    Snackbar.make(view, message, Snackbar.LENGTH_SHORT).show()
})
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容