SavedState
2019-11-05 本文已影响0人
禄眠
简介
在之前,我们知道使用ViewModel可以保存数据即使发生配置更改,如旋转屏幕、切换语言等,但是当程序放到后台后,系统意外杀死,那么数据也会随之消失,在以前通常需要通过onSaveInstanceState()
方法进行保存,但是现在有了可以和ViewModel适配的SavedState
使用
-
添加依赖
implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:1.0.0-rc01"
这是目前最新的版本,注意这个implementation "androidx.appcompat:appcompat:1.1.0"
也必须升到最新版 -
修改
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中查找
- 修改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()));
}
});
}
}