操作程序如下:
主要是创建一个
SavedStateHandle 来缓存上一次的数据,并通过重新读取上一次存储的数据来实现数据的存活
MyVIewModel:
1 package com.example.viewmodeltest; 2 3 import androidx.lifecycle.MutableLiveData; 4 import androidx.lifecycle.SavedStateHandle; 5 import androidx.lifecycle.ViewModel; 6 7 public class MyViewModel extends ViewModel { 8 private MutableLiveData<Integer> number; 9 10 private SavedStateHandle handle; 11 //存放简单数据 12 /* public MyViewModel(SavedStateHandle handle){ 13 this.handle=handle; 14 }*/ 15 16 public MutableLiveData<Integer> getNumber() { 17 if(number ==null){ 18 number =new MutableLiveData<>(); 19 number.setValue(0); 20 } 21 return number; 22 /* if (handle.contains(MainActivity.KEY_NUMBER)){ 23 handle.set(MainActivity.KEY_NUMBER,0); //第一次被加载时执行 24 } 25 return handle.getLiveData(MainActivity.KEY_NUMBER);*/ 26 } 27 public void add(){ 28 number.setValue(number.getValue()+1); 29 // getNumber().setValue(getNumber().getValue()+1); 30 } 31 }
Main_Activity
1 package com.example.viewmodeltest; 2 3 import androidx.annotation.NonNull; 4 import androidx.appcompat.app.AppCompatActivity; 5 import androidx.databinding.DataBindingUtil; 6 import androidx.lifecycle.SavedStateViewModelFactory; 7 import androidx.lifecycle.ViewModelProvider; 8 import androidx.lifecycle.ViewModelProviders; 9 10 import android.os.Bundle; 11 12 import com.example.viewmodeltest.databinding.ActivityMainBinding; 13 14 public class MainActivity extends AppCompatActivity { 15 16 ActivityMainBinding binding; 17 MyViewModel myViewModel; 18 public final static String KEY_NUMBER ="my_number"; //类似全局变量 存储上一次的数据 19 20 @Override 21 protected void onCreate(Bundle savedInstanceState) { 22 super.onCreate(savedInstanceState); 23 binding = DataBindingUtil.setContentView(this,R.layout.activity_main); 24 myViewModel = new ViewModelProvider(this).get(MyViewModel.class); 25 //myViewModel= ViewModelProviders.of(this,new SavedStateViewModelFactory(this)).get(MyViewModel.class); 26 /* if(savedInstanceState!=null){ 27 myViewModel.getNumber().setValue(savedInstanceState.getInt(KEY_NUMBER)); 28 }*/ 29 30 binding.setData(myViewModel); 31 binding.setLifecycleOwner(this); 32 33 } 34 35 @Override 36 protected void onSaveInstanceState(@NonNull Bundle outState) { //调用存储数据的函数 37 super.onSaveInstanceState(outState); 38 outState.putInt(KEY_NUMBER,myViewModel.getNumber().getValue()); 39 } 40 }
Android持久化存储的几种方式
1.文件存储
在应用开发当中会出现从网络中加载图片的过程。而从网络请求都需要时间,若网络速度不够快,就会造成网络图片加载过慢,甚至不成功的问题。在Android中对此的处理就是对已加载的图片文件进行缓存,包括内存缓存和硬盘缓存。
2.网络存储
例如每个用户的个人资料,都会在远程服务器存储一份,保证在不同的终端都可以登陆或者获取每个用户的个人资料。
3.SharedPreferences
它是一种轻量级的存储方式,适用于存储简单的参数配置。比如说上一次登陆的账号等等。
SharedPreferences的原理是使用XMl文件来存放数据。
4.Sqlit数据库存储和ContentProvider
ContentProvider
属于Android的四大组件之一。主要作用为用来与其他应用进行数据交互。
ContentProvider只是用来提供内容或者修改内容的接口。
具体如何去获取数据、去哪里获取数据我们还是需要依靠其他的数据获取的方式。在ContentProvider内部,我们可以通过网络去得到当前应用的用户资料,可以通过SharedPreferences得到当前应用的配置,也可以通过文件来得到某些资源。所以它当然也可以通过Sqlit来操作底层的数据库。·