当我正在使用 ViewModel
测试一小段代码时,我注意到一个小的逻辑问题,并想知道您如何解决这个问题。让我们看看这个小类:
public class MyDataViewModel extends ViewModel {
MutableLiveData<List<MyData>> mData = new MutableLiveData<>();
public ContactsViewModel() {}
public void setData(List<MyData> data) {
mData.postValue(data);
}
public LiveData<List<MyData>> getData() {
return mData;
}
}
问题是,如果你在“LiveData observer”被注册之前使用“setData()”更改“LiveData”,那么你的观察者在注册后不会触发。尽管这似乎很合理,但在编写异步代码时可能会导致问题,而且您不知道“setData()”是否会在注册观察者之前被调用。我想知道在注册观察者时如何检查数据是否已经设置。只需检查
getData().getValue() != null
吗?另一个问题是数据同步。我需要牢记
LiveData
同步(与所有其他普通数据一样),还是LiveData
在内部处理?例如,setData()
和getData().getValue()
可以同时调用吗?最后一个问题,似乎每当设置值时,“LiveData”观察者都会触发,即使它是相同的(例如,如果您在
Loader
的onLoadFinished()
中使用setData()
,则每次活动重新创建时都会调用setData()
)。这将导致观察者用相同的数据被调用两次。我想知道防止这种情况的最佳方法是什么。检查ViewModel
中的数据是否与我们拥有的数据类似,并且不要再次设置值?
MutableLiveData<List<MyData>>
而不是MutableLiveData<ArrayList<MyData>>
? - AfshinMutableLiveData
内部数据可变并不是一个好的实践,因此通常将数组列表包装在Collections.unmodifiableList()
中更好。除非您使用set/postValue
,否则它不应该是可修改的,而ArrayList
并不能防止这种情况。因此,MutableLiveData<List<T>>
可以实现这一点:D - EpicPandaForce