首页 > 解决方案 > 如何初始化 MutableLiveData 对象的集合值?

问题描述

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 对象的值。我试图通过 getter 和一个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

标签: androidkotlinandroid-jetpack

解决方案


也许原因是您试图在测试中运行它。您的示例在 DefaultTaskExecutor.isMainThread() 中失败,如下所示:

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

所以 Looper.getMainLooper() 在测试环境中返回 null。

而且,您是否尝试过通过“懒惰”委托初始化属性?

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

在我的情况下效果很好并且感觉更惯用


推荐阅读