美文网首页
AndroidViewModel+SharedPreferenc

AndroidViewModel+SharedPreferenc

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

简介

在上一篇文章写了Sharedpreferences的简单使用,这次把SharedPreferences和之前的例子结合起来
按照之前的例子,我们应该在ViewModel中进行SharedPreferences的操作,但是得到SharedPreferences需要有一个Context,最原始的办法就是在ViewModel声明一个Context变量,然后在Activity中传入,但是比较麻烦。所以就需要用到AndroidViewModel,该类继承自ViewModel,并且多了个getApplication()方法,便于使用SharedPreferences和调用资源文件

使用

  1. 新建一个类继承AndroidViewModel,并根据提示创建一个带参的构造器
public class MyViewModel extends AndroidViewModel {

    public MyViewModel(@NonNull Application application, SavedStateHandle handle) {
        super(application);
    }
}
  1. 创建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);
}
  1. 按照之前的例子写上对应的保存方法,并修改部分代码
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);
}
  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

相关文章

网友评论

      本文标题:AndroidViewModel+SharedPreferenc

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