Как инициализировать значение коллекции для объекта MutableLiveData? - PullRequest
0 голосов
/ 13 декабря 2018
class Foo : ViewModel() {
   val bars: MutableLiveData<ArrayList<Bar>> = MutableLiveData()
     get() {
       if(field.value == null) {
         field.setValue(ArrayList()) // NullPointerException
       }
     }
}

class FooTest(){
   @Test fun itShouldNotBlowUp() {
     Foo() //nullPointerException

   }

}

Я не понимаю, как инициализировать значение объекта MutableLiveData.Я попытался лениво инициализировать его через геттер и с блоком init.Оба подхода выбрасывают нулевой указатель при установке значения.bars не равно нулю.

Вот трассировка стека:

java.lang.NullPointerException
at android.arch.core.executor.DefaultTaskExecutor.isMainThread(DefaultTaskExecutor.java:58)
at android.arch.core.executor.ArchTaskExecutor.isMainThread(ArchTaskExecutor.java:116)
at android.arch.lifecycle.LiveData.assertMainThread(LiveData.java:434)
at android.arch.lifecycle.LiveData.setValue(LiveData.java:279)
at android.arch.lifecycle.MutableLiveData.setValue(MutableLiveData.java:33)
at org.Foo.<init>(Foo.kt:10)
at org.FooTest.ShouldNotBlowUp(FooTest.kt:3)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

Как инициализировать ArrayList и установить его в качестве значения bars?

1 Ответ

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

Возможно, причина в том, что вы пытаетесь запустить это в тесте.Ваш пример завершается с ошибкой в ​​DefaultTaskExecutor.isMainThread (), которая выглядит следующим образом:

public boolean isMainThread() {
    return Looper.getMainLooper().getThread() == Thread.currentThread();
}

Так что Looper.getMainLooper () возвращает нулевое значение в тестовой среде.

А также вы пыталисьинициализировать свойство с помощью «ленивого» делегата?

val bars: MutableLiveData<List<Bar>> by lazy {
    MutableLiveData<List<Bar>>().apply {
        value = emptyList()
    }
}

Это прекрасно работает в моем случае и выглядит более идиоматичным

...