操作程序如下:

主要是创建一个

SavedStateHandle 来缓存上一次的数据,并通过重新读取上一次存储的数据来实现数据的存活

MyVIewModel:

 package com.example.viewmodeltest;

 import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.SavedStateHandle;
import androidx.lifecycle.ViewModel; public class MyViewModel extends ViewModel {
private MutableLiveData<Integer> number; private SavedStateHandle handle;
//存放简单数据
/* public MyViewModel(SavedStateHandle handle){
this.handle=handle;
}*/ public MutableLiveData<Integer> getNumber() {
if(number ==null){
number =new MutableLiveData<>();
number.setValue(0);
}
return number;
/* if (handle.contains(MainActivity.KEY_NUMBER)){
handle.set(MainActivity.KEY_NUMBER,0); //第一次被加载时执行
}
return handle.getLiveData(MainActivity.KEY_NUMBER);*/
}
public void add(){
number.setValue(number.getValue()+1);
// getNumber().setValue(getNumber().getValue()+1);
}
}

Main_Activity

 package com.example.viewmodeltest;

 import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.SavedStateViewModelFactory;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProviders; import android.os.Bundle; import com.example.viewmodeltest.databinding.ActivityMainBinding; public class MainActivity extends AppCompatActivity { ActivityMainBinding binding;
MyViewModel myViewModel;
public final static String KEY_NUMBER ="my_number"; //类似全局变量 存储上一次的数据 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
myViewModel = new ViewModelProvider(this).get(MyViewModel.class);
//myViewModel= ViewModelProviders.of(this,new SavedStateViewModelFactory(this)).get(MyViewModel.class);
/* if(savedInstanceState!=null){
myViewModel.getNumber().setValue(savedInstanceState.getInt(KEY_NUMBER));
}*/ binding.setData(myViewModel);
binding.setLifecycleOwner(this); } @Override
protected void onSaveInstanceState(@NonNull Bundle outState) { //调用存储数据的函数
super.onSaveInstanceState(outState);
outState.putInt(KEY_NUMBER,myViewModel.getNumber().getValue());
}
}

Android持久化存储的几种方式

1.文件存储

在应用开发当中会出现从网络中加载图片的过程。而从网络请求都需要时间,若网络速度不够快,就会造成网络图片加载过慢,甚至不成功的问题。在Android中对此的处理就是对已加载的图片文件进行缓存,包括内存缓存和硬盘缓存。

2.网络存储

例如每个用户的个人资料,都会在远程服务器存储一份,保证在不同的终端都可以登陆或者获取每个用户的个人资料。

3.SharedPreferences

它是一种轻量级的存储方式,适用于存储简单的参数配置。比如说上一次登陆的账号等等。

SharedPreferences的原理是使用XMl文件来存放数据。

4.Sqlit数据库存储和ContentProvider

ContentProvider

属于Android的四大组件之一。主要作用为用来与其他应用进行数据交互。

ContentProvider只是用来提供内容或者修改内容的接口。

具体如何去获取数据、去哪里获取数据我们还是需要依靠其他的数据获取的方式。在ContentProvider内部,我们可以通过网络去得到当前应用的用户资料,可以通过SharedPreferences得到当前应用的配置,也可以通过文件来得到某些资源。所以它当然也可以通过Sqlit来操作底层的数据库。

参考 : https://blog.csdn.net/qq_35700731/article/details/78781540

2.13 ViewModel 使数据即使在后台被杀死数据也能存活的更多相关文章

  1. Flask04 后台获取请求数据、视图函数返回类型、前台接受响应数据

    1 后台获取请求数据 1.1 提出问题 前台发送请求的方式有哪些 后台如何获取这些请求的参数 1.2 前台发送请求的方式 GET.POST.AJAX 点睛:如果不指定请求方式,浏览器默认使用GET请求 ...

  2. HTML5与后台服务器的数据流动问题

    编辑中,尚未完稿...2017.7.14 1345 很多前端开发出来的HTML5可能对于后台开发者来说,并不是很清楚,也许像我一样一知半解.而且真的让人很糊涂的地方就是前端的JS如何与后端的数据库进行 ...

  3. MVC后台传dt数据

    //MVC后台传dt数据 public JsonResult TeacherVoteInfo([FromBody]Teacher_VoteModel model) { string tname = m ...

  4. 传递给后台的Json数据解析

    后台代码如下: public void ProcessRequest(HttpContext context) { context.Response.ContentType = "appli ...

  5. application/x-www-form-urlencoded multipart/form-data text/plain 后台返回的数据响应的格式类型

    application/x-www-form-urlencoded multipart/form-data text/plain 为什么上传文件的表单里要加个属性 enctype  后台返回的数据响应 ...

  6. jquery用ajax方式从后台获取json数据,将内容填充到下拉列表。

    从后台获取json数据,将内容填充到下拉列表. url:链接 par:ID sel:下拉列表选择器 //获取下拉列表 function BuildSelectBox(url, par, sel) { ...

  7. jquery ajax 后台和前台数据交互 C#

    <input type="button" id="updateInfo" value="更改货载重量" /> <div i ...

  8. jsp中添加弹窗口并且实现向后台双向传递数据

    思路:使用jquery-easyui框架实现弹出div,在jsp初始化时从后台获得数据初始化div中的form表单元素的value属性,从而获得后台数据.在点击确定按钮时使用ajax向后台发送数据. ...

  9. angular的$http.post()提交数据到Java后台接收不到参数值问题的解决方法

    本文地址:http://www.cnblogs.com/jying/p/6733408.html   转载请注明出处: 写此文的背景:在工作学习使用angular的$http.post()提交数据时, ...

随机推荐

  1. vs code 批量替换

    源内容 .icon-user, .icon-people, .icon-user-female, .icon-user-follow, .icon-user-following, .icon-user ...

  2. 基于金山快盘的Git服务器、快盘+ Git GUI 实现代码版本管理

        Git,这货堪称神器,用了它就再也不想用其他VCS了,就像上了高速就不想再走国道一样. Git的强大之处在于,你可以在局域网内的任何一个共享路径下创建仓库,而不需要运行任何服务.所有的操作都是 ...

  3. mongoDB 分片集群常用指令

    1.帮助指令:sh.help(),查看有哪些指令及其含义和使用方法. mongos> sh.help() sh.addShard( host )                       se ...

  4. I Hate it-HDU1754 点修改+区间最大值

    题意: 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感.不管你喜不喜欢, 现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然, ...

  5. oracle中 lob类型

    LOB大型对象(大数据字段类型) 分为:-BLOB: Binary 二进制大型对象 ,适用于存非文本型数据(程序,图像,影音) -CLOB:Character  字符型大型对象,适用于存储文本型数据( ...

  6. Jquery - ajax url路径问题

    Jquery - ajax url路径问题 2016年04月26日 09:59:27 yuxuac 阅读数 32308    版权声明:本文为博主原创文章,未经博主允许不得转载. https://bl ...

  7. JavaScript图片

    <ul> <li> <a href="images/666.jpg" title="frist img">frist< ...

  8. vagrant的使用介绍

    ()添加镜像到本地仓库 vagrant box add bt_centos6.6_zouke centos-6.6-x86_64.box )初始化 vagrant init ()启动vm vagran ...

  9. Linux 下JDK安装

     ubuntu下安装jdk  sudo apt-get install openjdk-8-jdk =============================================== Ce ...

  10. Jquery插件---渐隐轮播

    //需求:打开网页时,每秒钟自动切换下一张图片内容.也可以用鼠标点导航按钮进行图片切换 //代码如下 <!DOCTYPE html> <html lang="en" ...