Jetpack学习之 ViewModel,啃完999页Android面试高频宝典

val executor = Executors.newSingleThreadExecutor()

executor.submit {

Thread.sleep(5000)

str.postValue(“Rikka”)

}

}

}

接着我们需要在 Activity 中使用它:

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_main)

val model = ViewModelProvider(this).get(MyViewModel::class.java)

model.getStr().observe(this, Observer {

// 更新ui

Log.d(TAG, it)

})

}

获取 ViewModel 的方式有多种,除了上面代码中的 ViewModelProvider, 还有 by viewModels()等形式获取,需要相应的库来支持。

ViewModel 配合 LiveData 使用后,打印结果为:

在这里插入图片描述

这里需要注意:

  1. ViewModel 绝不能引用视图、Lifecycle 或可能存储对 Activity 上下文的引用的任何类。 因为 ViewModel 存在的时间会比这些特定的实例更长。 它可以包含 LiveData 对象,但 ViewModel 绝对不能去观察它的更改。

如果 ViewModel 需要 Application 上下文,可以扩展 AndroidViewModel 用于接收 Application 的构造函数。

  1. 一个 Activity 上可以有多个 Fragment, 所以这些 Fragment 可以共享一个 ViewModel, 通过 ViewModelProvider 观察到两Fragment 都是处于同一个容器,那么就会为他们提供同一实例的 ViewModel

3. 原理

=======================================================================

3.1 ViewModel 的生命周期


ViewModel 的生命周期是贯穿了整个 Activity 的生命周期

在这里插入图片描述

您通常在系统首次调用 Activity 对象的 onCreate() 方法时请求 ViewModel。系统可能会在 Activity 的整个生命周期内多次调用 onCreate(),如在旋转设备屏幕时。ViewModel 存在的时间范围是从首次请求 ViewModel 直到 Activity 完成并销毁。

3.2 ViewModel的创建


我们可以从 ViewModelProvider(ViewModelStoreOwner).get(Class<T>) 入手:

public ViewModelProvider(@NonNull ViewModelStoreOwner owner) {

this(owner.getViewModelStore(), owner instanceof HasDefaultViewModelProviderFactory

? ((HasDefaultViewModelProviderFactory) owner).getDefaultViewModelProviderFactory()
NewInstanceFactory.getInstance());

}

要求传入一个 ViewModelStroreOwner, 而 ComponentActivity / Fragment 都实现了这个接口,这个接口只有一个函数 getViewModelStore(), 所以实现的方法都会去创建一个 ViewModelStore 对象,它长这样:

public class ViewModelStore {

private final HashMap<String, ViewModel> mMap = new HashMap<>();

final void put(String key, ViewModel viewModel) {

ViewModel oldViewModel = mMap.put(key, viewModel);

if (oldViewModel != null) {

oldViewModel.onCleared();

}

}

final ViewModel get(String key) {

return mMap.get(key);

}

Set keys() {

return new HashSet<>(mMap.keySet());

}

public final void clear() {

for (ViewModel vm : mMap.values()) {

vm.clear();

}

mMap.clear();

}

}

这里面就是包含了一个 Map, k 是 String 也就是ViewModel 的名称, 而 value 就是 ViewModel 的实例。 再来看看 ViewModelProvider 的 get 方法:

public T get(@NonNull String key, @NonNull Class modelClass) {

// 1

ViewModel viewModel = mViewModelStore.get(key);

// 2

if (modelClass.isInstance(viewModel)) {

if (mFactory instanceof OnRequeryFactory) {

((OnRequeryFactory) mFactory).onRequery(viewModel);

}

return (T) viewModel;

} else {

if (viewModel != null) {

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!**

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-kXe3Zqu2-1711777681041)]

  • 15
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值