简介
在上一篇文章写了Sharedpreferences的简单使用,这次把SharedPreferences和之前的例子结合起来
按照之前的例子,我们应该在ViewModel中进行SharedPreferences的操作,但是得到SharedPreferences需要有一个Context
,最原始的办法就是在ViewModel声明一个Context变量,然后在Activity中传入,但是比较麻烦。所以就需要用到AndroidViewModel
,该类继承自ViewModel
,并且多了个getApplication()
方法,便于使用SharedPreferences和调用资源文件
使用
- 新建一个类继承AndroidViewModel,并根据提示创建一个带参的构造器
public class MyViewModel extends AndroidViewModel {
public MyViewModel(@NonNull Application application, SavedStateHandle handle) {
super(application);
}
}
- 创建SharedPreferences和SavedStateHandle,并修改构造器
private SavedStateHandle handle;
private SharedPreferences sp;
public MyViewModel(@NonNull Application application, SavedStateHandle handle) {
super(application);
this.handle = handle;
sp = application.getSharedPreferences("NUMBER_DATA", Context.MODE_PRIVATE);
}
- 按照之前的例子写上对应的保存方法,并修改部分代码
public MutableLiveData<Integer> getNumber() {
if (!handle.contains("NUMBER")) {
load();
}
return handle.getLiveData("NUMBER");
}
public void load() {
int result = sp.getInt("result", 0);
handle.set("NUMBER", result);
}
public void save() {
SharedPreferences.Editor editor = sp.edit();
editor.putInt("result", getNumber().getValue());
editor.apply();
}
public void add() {
getNumber().setValue(getNumber().getValue() + 1);
}
- 打开Activity,在
onPause()
方法中保存数据
@Override
protected void onPause() {
super.onPause();
viewModel.save();
}
当然保存数据可以在add()
方法中进行,这样数据更加可靠,但是如果add()
方法比较频繁的话就不适合保存数据
但是不能放在onStop()
或者是onDestroy()
中,因为应用如果放后台被杀死,可能不会调用此方法
完整代码:
package com.example.androidviewmodel;
import android.app.Application;
import android.content.Context;
import android.content.SharedPreferences;
import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.SavedStateHandle;
public class MyViewModel extends AndroidViewModel {
private SavedStateHandle handle;
private SharedPreferences sp;
public MyViewModel(@NonNull Application application, SavedStateHandle handle) {
super(application);
this.handle = handle;
sp = application.getSharedPreferences("NUMBER_DATA", Context.MODE_PRIVATE);
}
public MutableLiveData<Integer> getNumber() {
if (!handle.contains("NUMBER")) {
load();
}
return handle.getLiveData("NUMBER");
}
public void load() {
int result = sp.getInt("result", 0);
handle.set("NUMBER", result);
}
public void save() {
SharedPreferences.Editor editor = sp.edit();
editor.putInt("result", getNumber().getValue());
editor.apply();
}
public void add() {
getNumber().setValue(getNumber().getValue() + 1);
}
}
package com.example.androidviewmodel;
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.SavedStateViewModelFactory;
import androidx.lifecycle.ViewModelProviders;
import android.os.Bundle;
import com.example.androidviewmodel.databinding.ActivityMainBinding;
public class MainActivity extends AppCompatActivity {
MyViewModel viewModel;
ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
viewModel = ViewModelProviders.of(this, new SavedStateViewModelFactory(getApplication(), this)).get(MyViewModel.class);
binding.setViewModel(viewModel);
binding.setLifecycleOwner(this);
}
@Override
protected void onPause() {
super.onPause();
viewModel.save();
}
}
布局文件可以查看之前的DataBinding
网友评论