首页 文章

Viewmodel观察LiveData - 怎么样?

提问于
浏览
6

LifecycleLiveData 之前,Viewmodel可以很容易地观察到它自己的observable的变化 . 这只是订阅 Observable* 's changes and react to them. Then one might used a two-way binding to react immediately on user'输入的问题 .

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

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

但是,Viewmodel documentation明确指出:

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

(强调我的)

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

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

2 回答

  • 1

    如果其中一个LiveData对象发生更改,则可以使用Transformations调用操作 .

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

    MutableLiveData<Integer> personId = new MutableLiveData<>();
    LiveData<Person> person = Transformations.switchMap(personId, id -> getPerson(id));
    
  • 2

    我使用MediatorLiveData修复了这个问题 . 您可以按照以下步骤操作 .

    • 创建变量ex:result .

    private final MediatorLiveData> result = new MediatorLiveData <>();

    • 调用添加源方法,其中第一个参数是livingata,第二个是观察者 .

    LiveData> observable = service.createItems(); result.addSource(observable,response - > {//在这里编写代码
    }

    您可以找到更多细节,因为基本要求几乎相同 . android livedata make sequential call

相关问题