美文网首页
2021-08-13 解决协程调用LiveData异常后Live

2021-08-13 解决协程调用LiveData异常后Live

作者: 兣甅 | 来源:发表于2021-08-13 14:53 被阅读0次

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()
      }
    }))
image.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()
      }
    }
image.png

相关文章

网友评论

      本文标题:2021-08-13 解决协程调用LiveData异常后Live

      本文链接:https://www.haomeiwen.com/subject/hyndbltx.html