我可以将LiveData设为静态吗?

时间:2018-03-06 20:04:02

标签: android android-architecture-components android-livedata android-viewmodel

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

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

我曾经做过以下工作:
1.服务更改数据库
2. ViewModel监听DB更改
3.来自liveData的UI更新

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

为了实现我想要的,要么我需要使MutableLiveData静态,要么让ViewModel类在Activities之间共享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();
    }
}

2 个答案:

答案 0 :(得分:0)

Android Jetpack的cd $BIGTMP curl -O http://ftp.gnu.org/gnu/make/make-4.2.1.tar.gz tar xvf make-4.2.1.tar.gz cd make-4.2.1 ./configure --prefix=/opt/make && make && make install export PATH=/opt/make/bin:$PATh ln -s /opt/make/bin/make /opt/make/bin/gmake (相对于其他版本)的重点是ViewModel具有生命周期意识,并且在观察者被销毁(活动/碎片)时执行销毁自己的余地,或保留配置更改(例如方向)而无需重新初始化自身,从而使处理与配置更改相关的问题变得更加容易。

因此,如果您将ViewModelViewModel设为静态,则实际上您会实现它们的目的,并且尽管尝试这样做是可以理解的,但我当然希望它会崩溃并出错。因此,这需要您围绕它进行设计,而您提到的第一种方法可能是实现它的最佳方法。我不明白您为什么对第一个解决方案有疑问。我的看法是,它提供了最佳的用户体验:

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

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

答案 1 :(得分:0)

  • 我认为,如果MyViewModel将有许多LiveData字段,它将随着大量的getter和setter而增长。而且就我而言,更糟糕的是,您将破坏代码的可验证性,因为如果您要创建MyViewModel的新实例,您将期望此时的LiveData对象是无状态的,但是由于它是静态对象,因此您不知道它在简单创建后的确切状态。
  • 静态方法也不能被覆盖。关于字段:如果您想拥有公共字段,请假设在A类和B类中有errorMessage,而它们都扩展了C类(包含您的公共字段),则您可能会遇到意外的行为。另一方面,您可以将此代码复制到其他类中(不好的地方)。
  • 内存问题:如果使用大量静态变量/方法。因为直到程序结束,它们才会成为GC。

但这只是我的看法。