android - 如何初始化 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
?
解决方案
也许原因是您试图在测试中运行它。您的示例在 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()
}
}
在我的情况下效果很好并且感觉更惯用
推荐阅读
- recursion - 如何在递归函数中返回正确的布尔值?
- mysql - Laravel database returns undefined index error
- java - 泛型方法在实例化方法中传递的泛型类型时返回一个列表
- spring - Can i use springboot for designing a middleware application
- ember.js - How to call action of child component on parent events in ember JS
- c# - How to reversely play a video in unity?
- laravel - Laravel : Controller not found
- angular - angular 4 Production Build issue
- python - 用二进制numpy数组提取熊猫索引
- postgresql - 通过在 JSONB 列上应用过滤器来查询 postgresql 中的数据