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()
})
Kotlin-SingleLiveEvent 定义与使用
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
相关阅读更多精彩内容
- @[toc] 方法定义 定义语法 有返回值 也可以转换为: 还可以这样: 无返回值 使用Unit代替返回类型: U...
- 之前总是遇到弹窗Dialog,为了方便以后使用,自己方便简单封装了一个Utils方便以后根据需求方便拓展应用。截图...
- 对项目的基本介绍 1.整个框架主要是给MVVM框架使用的,自己写完interface接口后,通过自定义的注解就能自...