android - 如何在自定义视图中观察 LiveData
问题描述
我应该如何在自定义视图中观察 LiveData。我试图将它的上下文转换为生命周期所有者,但它会产生一些问题并且并非在所有情况下都有效。我试图放置一个二传手,但它也不起作用
解决方案
视图本身没有生命周期。个人使用有两种方法,它们实际上是同一件事,但其中一种是添加生命周期,而另一种是。没有生命周期。
class MyCustomView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
): View(context, attrs, defStyleAttr){
val myObserver = Observer<Long>{
//whatever
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
liveData.observeForever(myObserver)
}
override fun onDetachFromWindow() {
super.onDetachFromWindow()
liveData.removeObserver(myObserver)
}
}
此方法在附加/分离到窗口时手动观察/删除。当我观察到很少的实时数据并且它很简单/有限时,我更喜欢它
另一种选择是将我们的自定义视图变成 LifecycleOwner。我推荐这种方法 BaseCustomViews 和一些极其庞大和复杂的视图(如地图导航视图)
class BaseCustomView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
): View(context, attrs, defStyleAttr), LifecycleOwner {
protected val lifecycleRegistry = LifecycleRegistry(this);
override fun getLifecycle() = lifecycleRegistry
override fun onAttachedToWindow() {
super.onAttachedToWindow()
lifecycleRegistry.currentState = Lifecycle.State.RESUMED
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
lifecycleRegistry.currentState = Lifecycle.State.DESTROYED
}
val myObserver = Observer<Long>{
//whatever
}
init{
liveData.observe(this, myObserver}
}
}
推荐阅读
- firebase - 如何识别 Google Cloud 函数中的错误原因
- java - 如何通过在另一个类中调用的方法更改对象变量?
- itext7 - 如何使用 iText7 执行吊销检查?
- android - ListView 不显示添加的项目
- c++ - 静态原子全局变量在线程之间具有不同的值
- python - 打印素数的 Python 程序
- django - Django 表单 - 用于表单清理数据验证的嵌套过滤
- shell - 为我使用 SSH 登录的设备设置别名、功能和环境变量
- ansible - 具有错误变量“tomcat_password”的剧本中的 Ansible 保险库未定义
- spring - GraphQL Spring AccessDeniedException 处理