毕设博客(七)

view model状态保存:view model保存UI数据,当Activity进入后台、屏幕翻转或者语言切换的时候,view model都是存活的,数据也不会丢失。

但是一旦发生系统杀死,view model也会随之被杀掉,此时会重新创建一个新的view model对象,原本的UI数据也会丢失,导致Activity中的界面数据随之被重置。

很多时候,我们不希望发生上述的事情,所以需要进行修正。以下是通过简单的一个例子来完成:

先将模拟器设置成开发者模式:settings -> system -> About emulated device -> Build number点击7下,则此时处于开发者模式。回退一步,找到Developer options,点击,下拉找到Apps下的Don't keep activities,点击,此时,当使用者退出该程序或者将屏幕翻转时,数据将会被销毁。

首先实现一个功能为按下按钮实现加一功能的计数器。

由于刚刚的设置,现在将屏幕翻转 ,数据会被销毁.

可以用两种方法来决解以上的问题:

1、在Activity里面调用onSaveInstanceState(),这是种比较老的方法

@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt(KEY_NUMBER,myViewModel.getNumber().getValue());
}

2、view model本身自带一种属性,引入一个ViewModel SavedState使得view model的存活周期跨越了其被系统杀死的过程。

将以下这句话复制到build.gradle里面:

implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:1.0.0-alpha01' 

在MyViewModel里面添加一个handle:

public class MyViewModel extends ViewModel {
    //private MutableLiveData<Integer>number;
    private SavedStateHandle handle;
    public MyViewModel(SavedStateHandle handle){
        this.handle = handle;
    }

    public MutableLiveData<Integer>getNumber(){
        if(!handle.contains(MainActivity.KEY_NUMBER)){
            handle.set(MainActivity.KEY_NUMBER,0);
        }
        return handle.getLiveData(MainActivity.KEY_NUMBER);
    }
    public void add(){
        getNumber().setValue(getNumber().getValue() + 1);
    }
}

以上两种方法都可以运行成功。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值