我可以将 LiveData 设为静态吗?

jcl*_*ova 6 android android-livedata android-viewmodel android-architecture-components

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

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

我曾经执行以下操作并且它有效:
1. 服务更改数据库
2. ViewModel 侦听数据库更改
3. 来自 liveData 更改的 UI 更新

我发现这种方式太慢了。为了提高性能,我想要这样的东西:
1. 服务直接更改类对象
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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Ali*_*azi 1

ViewModelAndroid Jetpack(相对于其他版本)的全部意义ViewModel在于具有生命周期意识并执行魔法,例如在观察者被销毁(活动/片段)时销毁自身,或者在不初始化自身的情况下幸存配置更改(例如方向)重新进行,从而使处理与配置更改相关的问题变得更加容易。

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

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

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