美文网首页
SavedState

SavedState

作者: 禄眠 | 来源:发表于2019-11-05 13:42 被阅读0次

简介

在之前,我们知道使用ViewModel可以保存数据即使发生配置更改,如旋转屏幕、切换语言等,但是当程序放到后台后,系统意外杀死,那么数据也会随之消失,在以前通常需要通过onSaveInstanceState()方法进行保存,但是现在有了可以和ViewModel适配的SavedState

使用

  1. 添加依赖
    implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:1.0.0-rc01"
    这是目前最新的版本,注意这个implementation "androidx.appcompat:appcompat:1.1.0"也必须升到最新版

  2. 修改ViewModel的实现类

package com.example.savedstatedemo;

import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.SavedStateHandle;

public class MyViewModel extends ViewModel {

    private SavedStateHandle handle;

    public MyViewModel(SavedStateHandle handle) {
        this.handle = handle;
    }

    public MutableLiveData<Integer> getNumber() {
        if (!handle.contains(MainActivity.NUM_KEY)) {
            handle.set(MainActivity.NUM_KEY, 0);
        }
        return handle.getLiveData(MainActivity.NUM_KEY);
    }

    public void add() {
        getNumber().setValue(getNumber().getValue() + 1);
    }
}

上面主要修改了getNumber()方法,不是直接创建LiveData,而是先到SavedStateHandle中查找

  1. 修改Activity的ViewModel创建方式
viewModel = ViewModelProviders.of(this, new SavedStateViewModelFactory(getApplication(), this)).get(MyViewModel.class);

这里可以对比一下之前的实现方式:

viewModel = ViewModelProviders.of(this).get(MyViewModel.class);
viewModel = ViewModelProviders.of(this, new SavedStateViewModelFactory(getApplication(), this)).get(MyViewModel.class);

可以看到这次ViewModel带了一个参数

完整代码:

package com.example.viewmodeldemo;

import androidx.lifecycle.ViewModel;

public class MyViewModel extends ViewModel {

    private int num;

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }
}
package com.example.viewmodeldemo;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import androidx.lifecycle.ViewModelProviders;

public class MainActivity extends AppCompatActivity {

    TextView textView;
    Button addBtn;
    MyViewModel viewModel;

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

        textView = findViewById(R.id.textView);
        addBtn = findViewById(R.id.button);

        viewModel = ViewModelProviders.of(this).get(MyViewModel.class);
        textView.setText(String.valueOf(viewModel.getNum()));

        addBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                viewModel.setNum(viewModel.getNum() + 1);
                textView.setText(String.valueOf(viewModel.getNum()));

            }
        });
    }
}

相关文章

网友评论

      本文标题:SavedState

      本文链接:https://www.haomeiwen.com/subject/squsbctx.html