Skip to content

常见问题 Q&A

ViewModel什么时候被销毁?

一般来说,开发者无需关心ViewModel的生命周期。如果开发者没有额外保留引用,ViewModel会被绑定的rootView使用Tag的方式保留引用。当View被销毁时,ViewModel会被一并销毁。

Pan的工厂方法调用时机只能在OnCreate中嘛?

对于直接用于Activity页面最高层级上布局ViewModel,Pan.with...应该选择在OnCreate中调用。当然放在OnStart/OnResume理论上也能工作,但其对OnStart/OnResume的事件监听会受影响。例如在OnResume中调用,会导致Controller无法监听到OnStart和OnResume事件。

对于用于Adapter内的ViewModel,由于其一般不需要监听Activity生命周期,所以不是特别要紧。

对用于Fragment页面上最高层级的布局ViewModel,也同样需要在onCreateView中使用,以尽可能的给Controller监听更多事件的可能。

全量刷新和局部刷新?

ViewModel只有一个render方法,因此,对于ViewModel来说,每次Controller调用render都相当于是全量刷新。可能有人会担心全量刷新有点浪费性能,但在实际使用的过程中,一个页面往往是由多层级的多个ViewModel构成,每个ViewModel的全量刷新,实际上相当于整个页面中的局部刷新,这反而在让代码鲁棒性大大增强的同时,尽可能兼顾了性能。这样做有很多好处,例如:

  1. Controller无需关心该刷新那个局部位置,而只需要控制ViewModel的数据状态,剩下的交给render
  2. 每次render将把所有的数据状态变化都显示出来,避免开发者忘记更新某个局部
  3. 对于整个页面来说,最高层的ViewModel无需关系其包含的其他ViewModel具体如何刷新,只需关心自己的刷新逻辑

RxJava?

Pan只要求Controller去控制ViewModel的render时机,但并不关心如何做到这一点。因此,RxJava/RxAndroid是可以直接在Pan的框架内使用,且没有任何阻碍的,而且,我们团队一直以来都是在这么做。