gpt4 book ai didi

android - 我可以将 LiveData 设为静态吗?

转载 作者:行者123 更新时间:2023-12-03 05:24:01 25 4
gpt4 key购买 nike

我不知道这是不是一个愚蠢的问题。这可能会违背 LiveData/ViewModel 的目的。

我可以将 LiveData 设为静态吗?我的原因是我有一个来自更新信息的服务的监听器。所以我需要一种从服务中“设置/更改”LiveData 的方法。

我曾经执行以下操作并且它有效:
1.服务改变DB
2.ViewModel监听DB变化
3. liveData 更改带来的 UI 更新

我发现这种方式太慢了。为了提高性能,我想要类似的东西:
1.Service直接改变类对象
2.ViewModel监听类对象变化
3. liveData 更改带来的 UI 更新

为了实现我想要的目标,我需要将 MutableLiveData 设为静态,或者使 ViewModel 类在 Activity 之间共享相同的 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();
}
}

最佳答案

Android Jetpack(相对于其他版本)的 ViewModel 的全部要点是让 ViewModel 具有生命周期意识,并在观察者被销毁时执行类似销毁自身的魔法( Activity/fragment ),或在配置更改(例如方向)中幸存,而无需重新初始化自身,从而更容易处理与配置更改相关的问题。

因此,如果您将 ViewModelLiveData 设为静态,您实际上会违背它们的目的,并且很可能会泄漏 ViewModel 的数据,尽管需要这样做是可以理解的。因此,这需要您设计解决方案,而您提到的第一种方法可能是您可以做到的最佳方法。我不明白为什么您对第一个解决方案有疑问。在我看来,它提供了最佳的用户体验:

  1. 您在 onCreate 中的 fragment 或 Activity 中初始化 ViewModel,并向数据添加一个 Observer
  2. 如果数据库已有一些数据,您的观察者将立即收到它,并且 UI 将立即使用现有数据进行更新。
  3. 服务发出 API 请求并更改数据库
  4. 数据库更改会触发 ViewModel 中的数据更新
  5. 观察者刷新收到的数据,并将其传递给您的 View /适配器
  6. 界面更新为最新数据,并带有一些精美的动画来指示添加/删除项目。

据我所知,没有比这更好的了。由于您的问题是几个月前的,我很想知道您最终做了什么?

关于android - 我可以将 LiveData 设为静态吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49139096/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com