2024年Android最全Android Jetpack系列之 ViewModel,面试的一家公司之前拒绝了,后来觉得又想去怎么办
总结
写到这里也结束了,在文章最后放上一个小小的福利,以下为小编自己在学习过程中整理出的一个关于Flutter的学习思路及方向,从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。
由于内容较多就只放上一个大概的大纲,需要更及详细的学习思维导图的
还有高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术资料,并且还有技术大牛一起讨论交流解决问题。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onStop() {
whetherToCount = false;
Log.d(TAG, "onStop: ");
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestory() {
}
}
我们运行程序,在计数的过程中 使屏幕旋转,运行结果如下所示:

我们可以看到,当屏幕旋转的时候,由于生命周期发生了改变,导致数据被销毁,所以计数器的计数又从初始值开始计数了,那么我们如何解决这个问题呢,你肯定会说,缓存呀,重写onSabeInstanceState()方法等等,都可以但是都不够优雅,那么如何优雅的来解决这个问题呢,这就是我们的今天的主角 ViewModel。
ViewModel的使用
我们新建Main3ActivityModel 继承自 ViewModel,在Main3ActivityModel中定义count变量 如下所示:
public class Main3ActivityViewModel extends ViewModel {
public int count = 0;
}
没错,就是这么简单,我们只要保证计数的变量是这个model中的变量,就可以解决我们上面的问题
我们通过ViewModelProviders来获取ViewModel对象
main3ActivityViewModel = ViewModelProviders.of(this).get(Main3ActivityViewModel.class);
但是这个方法已经过时了,替代方法是
main3ActivityViewModel = new ViewModelProvider(this).get(Main3ActivityViewModel.class);
为了让WorkUtil使用Model中的变量,所以我们要将ViewModel 传递过去,在WorkUtil中新增一个构造方法
private Main3ActivityViewModel main3ActivityViewModel;
public WorkUtil(Main3ActivityViewModel main3ActivityViewModel) {
this.main3ActivityViewModel = main3ActivityViewModel;
}
我们将WorkUtil中的计数变量count 改为 main3ActivityViewModel.count,如下所示:
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void start() {
new Thread(new Runnable() {
@Override
public void run() {
while (whetherToCount) {
try {
Thread.sleep(1000);
main3ActivityViewModel.count++;
Log.d(TAG, "start: " + main3ActivityViewModel.count);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
main3Activity中在lifecycle中传参:
getLifecycle().addObserver(new WorkUtil(main3ActivityViewModel));
再次运行程序,运行过程中旋转手机屏幕,打印如下所示:

我们可以看到,在屏幕旋转之后,计数器的计数保留了,那么viewModel是如何做到的呢,这是因为ViewModel 对象存在的时间比视图或 LifecycleOwners 的特定实例存在的时间更长,ViewModel的生命周期如下图所示(摘自官网)

向ViewModel传参
当前计数的需求是从0开始计时,我们现在修改需求如下,使用用户输入的数字为起点开始计数,这样的话ViewModel中的count就不是0了,而是传入的参数,我们在Main3Activity中定义变量inputCount 来模拟用户输入的数字
private int inputCount = 100;
在Main3ViewModel中添加构造方法
public int count = 0;
public Main3ActivityViewModel(int count) {
this.count = count;
}
看到这里,你可能会说,我们直接new一个传过去不就行了吗,请记住这是万万不行的,因为如果我们使用直接实例化来创建ViewModel,那么ViewModel的生命周期就受Activity的影响了,所以为什么我们只能通过ViewModelProvider来获取ViewModel的实例。
最后
愿你有一天,真爱自己,善待自己。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
天,真爱自己,善待自己。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
更多推荐

所有评论(0)