假设我正在观察一个片段中的LiveData,并且想在接收到数据后删除观察者。
例如:
val testLiveData = MutableLiveData<String>()
并观察为:
testLiveData.observe(this, Observer<String> {
//TODO://Remove this Observer from here
//testLiveData.removeObserver(this)
})
我该怎么做?调用“ this”是给我一个Fragment实例,而不是当前的Observer。
但是,我可以这样做。
testLiveData.observe(this, object : Observer<String>{
override fun onChanged(t: String?) {
testLiveData.removeObserver(this)
}
})
在SAM中有什么方法可以做同样的事情吗?
答案 0 :(得分:1)
在第一种情况下,您无法访问this
,因为不能保证observe
的每次调用都会创建Observer<String>
的新实例。
如果lambda不能从定义该函数的函数访问任何变量,则在调用之间重用相应的匿名类实例(即,创建了一个单例Observer
,用于每个observe
调用)。
因此,为了实现侦听器,应使用第二个变体(object : Observer<String>
)。这就强制了每次调用Observer
时都会创建一个新的observe
,然后可以在其实现的方法中以this
的身份对其进行访问。