Viewmodel观察LiveData - 怎么样?

Spo*_*ook 8 binding android mvvm android-lifecycle android-livedata

在之前Lifecycle和之前LiveData,Viewmodel可以很容易地观察到它自己的观察者的变化.这只是订阅Observable*变化并对其做出反应的问题.然后可以使用双向绑定立即对用户的输入做出反应.

在Android Studio Canary中,现在允许绑定到LiveData对象,前提是Binding知道其所有者的生命周期(ViewBinding现在有其他setLifecycle方法),Android Studio Canary信息:

您现在可以将LiveData对象用作数据绑定表达式中的可观察字段.ViewDataBinding类现在包含一个新的setLifecycle方法,您需要使用该方法来观察LiveData对象.

但是,Viewmodel文档清楚地说明了:

ViewModel对象可以包含LifecycleObservers,例如LiveData对象.但是,ViewModel对象绝不能观察到生命周期感知的可观察对象(例如LiveData对象)的更改.

(强调我的)

那么,如果ViewModel无法订阅它们,那么如何立即对LiveData更改做出反应呢?

而且,为什么 Viewmodel无法观察到自己的LiveData的变化?

Sau*_*are 5

我使用MediatorLiveData. 您可以按照以下步骤操作。

  1. 创建一个变量(例如结果)。

    private final MediatorLiveData<Resource<RequestType>> result = new MediatorLiveData<>();
    
    Run Code Online (Sandbox Code Playgroud)
  2. 调用addSource方法,其中第一个参数是LiveData观察者,第二个参数是观察者。

    LiveData<Resource<EmptyResponse>> observable = service.createItems();
    result.addSource(observable, response -> {
        //Write code here 
    }
    
    Run Code Online (Sandbox Code Playgroud)

另请参阅此 SO 答案。基本要求几乎相同。


woo*_*dii 3

如果您的 LiveData 对象之一发生更改,您可以使用转换来调用操作。

例如,用户在 a 中选择一个人Spinner,并且您想要加载相应的人对象。

MutableLiveData<Integer> personId = new MutableLiveData<>();
LiveData<Person> person = Transformations.switchMap(personId, id -> getPerson(id));
Run Code Online (Sandbox Code Playgroud)

  • 这依赖于订阅“person”,这就是问题所在。 (2认同)