Что я должен предоставить параметру «LifeCycleOwner» при наблюдении в Kotlin? - PullRequest
0 голосов
/ 21 марта 2020

Я довольно новичок в Android Room, где используются LiveData, с которыми я тоже не знаком. Я заметил, что в уроках возвращаемые данные используют LiveData упаковщик, например:

@Dao
interface PersonDao {
    @Query("SELECT * FROM person")
    fun getAll(): LiveData<List<Person>>
}

Затем, чтобы прочитать данные, я использую этот код:

class PersonListActivity: AppCompatActivity() {

    List<Person> personList = listOf()

    init {
        val db = RoomDatabase.getDatabaseInstance()
        db.personDao.getAll().observe(this, Observe<List<Person>> { data ->
            personList = data
        })
    }

}

Проблема заключается в ошибке повышения IDE "несоответствие типов". Обязательно: LifeCycleOwner. Найдено: PersonListActivity. Я не понимаю, как учебники могут случайно указать «this» в параметре наблюдения владельца. Я также попытался указать context и applicationContext в параметре владельца, и он не работает.

После изучения класса LifeCycleOwner я попытался добавить реализацию LifeCycleOwner. Но тогда класс требует реализации функции getLifeCycle(). Итак, я вернулся к нулю.

class PersonListActivity: AppCompatActivity(), LifeCycleOwner {

    List<Person> personList = listOf()

    init {
        val db = RoomDatabase.getDatabaseInstance()
        db.personDao.getAll().observe(this, Observe<List<Person>> { data ->
            personList = data
        })
    }

    override fun getLifeCycle() {
        // what should I return here??????
    }

}

Почему во всех руководствах, которые я читаю о LiveData, вообще ничего не говорится о LifeCycleOwner? Я использую здесь неправильную функцию наблюдения?

public abstract class LiveData<T> {
    ...
    @MainThread
    public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) { ... }
    ...
}

1 Ответ

1 голос
/ 21 марта 2020

Начиная с версии 1.1.0 (исключая нестабильные выпуски) androidx.appcompat:appcompat, AppCompatActivity реализует LifecycleOwner (см. ComponentActivity). Таким образом, вы можете использовать this при вызове:

db.personDao.getAll().observe(this, Observe<List<Person>> { data ->
    personList = data
})

Без реализации чего-либо еще.

Кроме того, я бы переместил эти строки в Activity.onCreate().

...