如何在Kotlin中获取SAM接口的对象

时间:2018-12-17 07:19:51

标签: android kotlin

假设我正在观察一个片段中的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中有什么方法可以做同样的事情吗?

1 个答案:

答案 0 :(得分:1)

在第一种情况下,您无法访问this,因为不能保证observe的每次调用都会创建Observer<String>的新实例。 如果lambda不能从定义该函数的函数访问任何变量,则在调用之间重用相应的匿名类实例(即,创建了一个单例Observer,用于每个observe调用)。

因此,为了实现侦听器,应使用第二个变体(object : Observer<String>)。这就强制了每次调用Observer时都会创建一个新的observe,然后可以在其实现的方法中以this的身份对其进行访问。