Android Jetpack -- ViewModel篇

本文详细介绍了Android Jetpack中的ViewModel组件,阐述了ViewModel在处理Fragment/Activity数据恢复、降低UI控制器复杂性方面的作用。通过实例展示了ViewModel如何在配置变更时保持数据,以及如何配合LiveData和DataBinding使用。此外,还提到了如何加强ViewModel以支持异常生命周期,并利用AndroidViewModel处理SharedPreference。最后,讨论了ViewModel替代Loader的可能性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ViewModel是一个负责为Fragment/Activity配置和管理数据的类,同时处理Fragment/Activity与Application其余部分的通信。
ViewModel始终与Scope(Fragment/Activity)相关联创建,同时一直保留当Scope存在时,例如Activity被finish。换句话说,ViewModel不会随着其拥有者因配置更改被销毁而销毁(旋转,横竖屏切换),新的拥有者会重新建立与ViewModel的关联。
ViewModel旨在获取和保存Activity或Fragment必要的信息,Activity或Fragment能够观察到ViewModel的数据改变,ViewModel通常通过LiveData或Android Data Binding暴露数据,也可以在你喜欢的框架中使用可观察构造。
ViewModel只负责管理UI数据,不应访问视图结构和持有Activity或Fragment的引用。

ViewModel的出现主要为了解决两个问题:
1.当Actvitiy销毁重建过程中的数据恢复问题,虽然原来可以使用onSaveInstanceState()来完成,但是只支持能被序列化的数据而且是小量数据,对于大量数据则显得有点无力。
2.UI控制器的工作繁忙,UI控制器主要用于处理显示,交互,其他的额外操作可以委托给其他类完成,将不应该分配给UI的任务分离出来是必要的,这也就是上面所说的分离关注点原则
下面则是示意图
官方示意图

ViewModel实例

ViewModel在配置更改期间能自动保留其对象,以便它们所持有的数据可立即用于下一个Activity或片段Fragment
下面通过一个具体的实例:
MainActivity.java:

public class MainActivity extends AppCompatActivity {
   

    private MyViewModel myViewModel;

    private TextView tv;
    private Button button1, button2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
   
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);

        tv = findViewById(R.id.textView);
        tv.setText(String.valueOf(myViewModel.num));
        button1 = findViewById(R.id.button1);
        button2 = findViewById(R.id.button2);

        button1.setOnClickListener(new View.OnClickListener() 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值