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 使用后,打印结果为:
这里需要注意:
- ViewModel 绝不能引用视图、Lifecycle 或可能存储对 Activity 上下文的引用的任何类。 因为 ViewModel 存在的时间会比这些特定的实例更长。 它可以包含 LiveData 对象,但
ViewModel
绝对不能去观察它的更改。
如果 ViewModel 需要 Application 上下文,可以扩展 AndroidViewModel
用于接收 Application 的构造函数。
- 一个 Activity 上可以有多个 Fragment, 所以这些 Fragment 可以共享一个 ViewModel, 通过 ViewModelProvider 观察到两Fragment 都是处于同一个容器,那么就会为他们提供同一实例的 ViewModel
=======================================================================
ViewModel 的生命周期是贯穿了整个 Activity 的生命周期
您通常在系统首次调用 Activity 对象的 onCreate()
方法时请求 ViewModel。系统可能会在 Activity 的整个生命周期内多次调用 onCreate(),如在旋转设备屏幕时。ViewModel 存在的时间范围是从首次请求 ViewModel 直到 Activity 完成并销毁。
我们可以从 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移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!**
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-kXe3Zqu2-1711777681041)]