【发布时间】:2018-03-06 20:04:02
【问题描述】:
我不知道这是不是一个愚蠢的问题。这可能会破坏 LiveData/ViewModel 的目的。
我可以将 LiveData 设为静态吗?我的原因是我有一个来自更新信息的服务的侦听器。所以我需要从服务中“设置/更改”LiveData。
我曾经做过以下操作,效果很好:
1. 服务更改数据库
2. ViewModel 监听 DB 变化
3. 来自 liveData 变化的 UI 更新
我发现这种方式太慢了。为了提高性能,我想要这样的东西:
1.Service直接改变类对象
2. ViewModel 监听类对象的变化
3. 来自 liveData 变化的 UI 更新
为了实现我想要的,要么我需要将 MutableLiveData 设为静态,要么让 ViewModel 类在活动之间共享相同的 ViewModel 实例。
这是个好主意吗?
public class MyViewModel extends AndroidViewModel {
// Note: this MutableLiveData is static
private static MutableLiveData<MyModel> mutableLiveData;
public MyViewModel(@NonNull Application application) {
super(application);
}
LiveData<MyModel> getLiveDataList() {
if (mutableLiveData == null) {
mutableLiveData = new MutableLiveData<>();
loadDataFromDb();
}
return mutableLiveData;
}
private void loadDataFromDb() {
// load data from DB
// mutableLiveData.setValue(MyModelFromDb); // Omit the real implementation
}
// Note: this method is static
public static void setData(MyModel newData) {
mutableLiveData.setValue(newData);
}
@Override
protected void onCleared() {
super.onCleared();
}
}
【问题讨论】:
-
“我发现这种方式太慢了” 什么是“太慢”?数据库在哪里?
-
您是否考虑过将本地广播从您的服务发送到您的活动中已注册的广播接收器,并将更新时间与 LiveData 更新进行比较?
-
是的,如果您认为它会更快的过程,您可以将其设为静态......但请务必从相同或其他服务更新数据库..(因为静态数据将持续到该应用程序在前台...如果您重新启动数据将丢失)
-
但请务必从同一位置更新数据库 -> 是的,我打算这样做。谢谢。
-
一个类似但更灵活的做法,就是引入一个repository层,可以为你缓存数据:developer.android.com/topic/libraries/architecture/…repository创建时,可以加载一次数据,然后观察db后续变化。
标签: android android-architecture-components android-livedata android-viewmodel