ViewModel 跟 Activity 之间到底是什么关系?

148 阅读1分钟

ViewModelProvider(activity)[YourViewModel::class.java]�我们日常都是如此获得ViewModel的,那你知道ViewModelProvider到底是怎么获得ViewModel的吗?ViewModel又是如何跟activity/fragment之间绑定的?上图整理了相关类之间的关系。

  • ViewModelProvider 是如何对外提供 ViewModel的

ViewModelProvier 中有两个重要成员变量:ViewModelStore 和 Factory。Factory 负责创建 ViewModel,ViewModelStore 负责存储 ViewModel。ViewModleProvier 就是通过这两个成员变量来对外提供 ViewModel

  • ViewModel 是如何跟activity/fragment之间绑定的

activity 直接继承了ViewModelStoreOwner、HasDefaultViewModelProviderFactory 这两个接口,换句话来说acivity本身就持有了ViewModelStore 和 Factory。ViewModelStore中存储 ViewModel 的 hashtagMap 是activity 成员变量的成员变量,就这样 activity 和 ViewModel就绑定到了一起。 总结:

  1. Factory、 ViewModelStore、ViewModelStoreOwner 源码里面的命名规则其实就已经把中间的逻辑关系描述清除了。
  2. 由于只能继承一个父类,但是可以继承多个接口。这里 activity 通过继承 ViewModelStoreOwner 接口,接口中又提供了 getViewModelStore():ViewModelStore 方法,间接让 activity 持有了ViewModelStore。