Как я могу получить объект SAM Interface в Kotlin - PullRequest
0 голосов
/ 17 декабря 2018

Предположим, я наблюдаю LiveData во фрагменте и хочу удалить наблюдателя после получения данных.

Например:

val testLiveData = MutableLiveData<String>()

и Наблюдать как:

testLiveData.observe(this, Observer<String> {
        //TODO://Remove this Observer from here
        //testLiveData.removeObserver(this)
    })

Как я могу это сделать?При вызове «это» я получаю экземпляр фрагмента вместо текущего наблюдателя.

Однако я могу сделать это следующим образом.

 testLiveData.observe(this, object : Observer<String>{
        override fun onChanged(t: String?) {
            testLiveData.removeObserver(this)
        }

    })

Есть ли способ сделать то же самое в SAM?

1 Ответ

0 голосов
/ 17 декабря 2018

В первом случае вы не можете получить доступ к this, поскольку не гарантируется, что каждый вызов observe создает новый экземпляр Observer<String>.Если лямбда не обращается к какой-либо переменной из функции, в которой она определена, соответствующий анонимный экземпляр класса повторно используется между вызовами (т. Е. Создается одиночный код Observer, который используется для каждого вызова observe).

Таким образом, для реализации слушателей следует использовать второй вариант (object : Observer<String>).Это гарантирует, что каждый раз при вызове observe создается новый Observer, который в свою очередь может быть доступен как this в его реализованных методах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...