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
的值?
最佳答案
也许原因是您试图在测试中运行它。您的示例在 DefaultTaskExecutor.isMainThread() 中失败,如下所示:
public boolean isMainThread() {
return Looper.getMainLooper().getThread() == Thread.currentThread();
}
所以 Looper.getMainLooper() 在测试环境中返回 null。
而且,您是否尝试过通过“懒惰”委托(delegate)初始化属性?
val bars: MutableLiveData<List<Bar>> by lazy {
MutableLiveData<List<Bar>>().apply {
value = emptyList()
}
}
在我的情况下效果很好并且感觉更惯用
关于android - 如何初始化 MutableLiveData 对象的集合值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53754358/