1.重写Observer以便Catch住监听中处理数据的异常
class MyObserver<T>(
private val error: ((e: Throwable) -> Unit)? = null,
private val changed: (t: T) -> Unit,
) : Observer<T> {
override fun onChanged(t: T) {
try {
changed.invoke(t)
} catch (e: Throwable) {
error?.invoke(e)
}
}
}
2.在协程中调用,这里为了方便,直接使用了https://github.com/liujingxing/rxlife
val liveData = MutableLiveData<Boolean>()
private fun setLiveDataValue(suc: Boolean) {
rxLifeScope.launch({
Log.e("TAG", "赋值=$suc")
liveData.value = suc
}, { e ->
Log.e("TAG", "异常1:${e.message}")
})
}
3.调用赋值
btn1.setOnClickListener { setLiveDataValue(false) }
btn2.setOnClickListener { setLiveDataValue(true) }
4.使用MyObserver监听赋值,在btn1点击后,点击btn2依然能收到监听
liveData.observe(this, MyObserver({ e ->
Log.e("TAG", "异常2:${e.message}")
}, { suc ->
Log.e("TAG", "接收赋值=$suc")
if (!suc) {
throw Throwable("fail")
} else {
Toast.makeText(btn1.context, "Success=$suc", Toast.LENGTH_SHORT).show()
}
}))
![](https://img.haomeiwen.com/i1459597/ed217e7e797d354b.png)
5.使用默认监听赋值,在btn1点击后,点击btn2无法收到监听
liveData.observe(this) { suc ->
Log.e("TAG", "接收赋值=$suc")
if (!suc) {
throw Throwable("fail")
} else {
Toast.makeText(mainTv2.context, "Success=$suc", Toast.LENGTH_SHORT).show()
}
}
![](https://img.haomeiwen.com/i1459597/3144ec08920823bf.png)
网友评论