2.13 ViewModel 使数据即使在后台被杀死数据也能存活
操作程序如下:
主要是创建一个
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 使数据即使在后台被杀死数据也能存活的更多相关文章
- Flask04 后台获取请求数据、视图函数返回类型、前台接受响应数据
1 后台获取请求数据 1.1 提出问题 前台发送请求的方式有哪些 后台如何获取这些请求的参数 1.2 前台发送请求的方式 GET.POST.AJAX 点睛:如果不指定请求方式,浏览器默认使用GET请求 ...
- HTML5与后台服务器的数据流动问题
编辑中,尚未完稿...2017.7.14 1345 很多前端开发出来的HTML5可能对于后台开发者来说,并不是很清楚,也许像我一样一知半解.而且真的让人很糊涂的地方就是前端的JS如何与后端的数据库进行 ...
- MVC后台传dt数据
//MVC后台传dt数据 public JsonResult TeacherVoteInfo([FromBody]Teacher_VoteModel model) { string tname = m ...
- 传递给后台的Json数据解析
后台代码如下: public void ProcessRequest(HttpContext context) { context.Response.ContentType = "appli ...
- application/x-www-form-urlencoded multipart/form-data text/plain 后台返回的数据响应的格式类型
application/x-www-form-urlencoded multipart/form-data text/plain 为什么上传文件的表单里要加个属性 enctype 后台返回的数据响应 ...
- jquery用ajax方式从后台获取json数据,将内容填充到下拉列表。
从后台获取json数据,将内容填充到下拉列表. url:链接 par:ID sel:下拉列表选择器 //获取下拉列表 function BuildSelectBox(url, par, sel) { ...
- jquery ajax 后台和前台数据交互 C#
<input type="button" id="updateInfo" value="更改货载重量" /> <div i ...
- jsp中添加弹窗口并且实现向后台双向传递数据
思路:使用jquery-easyui框架实现弹出div,在jsp初始化时从后台获得数据初始化div中的form表单元素的value属性,从而获得后台数据.在点击确定按钮时使用ajax向后台发送数据. ...
- angular的$http.post()提交数据到Java后台接收不到参数值问题的解决方法
本文地址:http://www.cnblogs.com/jying/p/6733408.html 转载请注明出处: 写此文的背景:在工作学习使用angular的$http.post()提交数据时, ...
随机推荐
- 「HNOI2016」大数
题目描述 给定一个质数\(p\)和一个数字序列,每次询问一段区间\([l,r]\), 求出该序列区间\([l,r]\)内的所有子串,满足该子串所形成的数是\(p\)的倍数(样例的解释也挺直观的) 基本 ...
- Python 基础之模块之os os.path 及os与shutil对比
一: os 对系统进行操作 #注:以下操作都在linux环境下操作,且很多运行之前需要做好相关条件import os#(1)system() 在python总执行系统命令#os.system(&quo ...
- scrapy 中没有 crawl 命令
确保两点: 1.把爬虫.py 复制到 spider 文件夹里 如 执行 scrapy crawl demo.py (spiders 中就要有 demo.py 文件) 2.在项目文件夹内执行命令 在 s ...
- mac访问mysql
常用操作 开启Mysql服务 1.在终端中输入添加MySQL路径的命令: PATH="$PATH":/usr/local/mysql/bin; 2.在终端输入 mysql -uro ...
- jwt 认证
目录 jwt 认证示意图 jwt 认证算法:签发与检验 drf 项目的 jwt 认证开发流程(重点) drf-jwt 框架基本使用 token 刷新机制(了解) jwt 认证示意图 jwt 优势 1 ...
- 更改windows系统的快捷键方法
众所周知,windows平台有很多快捷键使用非常的别扭. 现在提供windows 平台快捷键替换的绝佳软件:autohotkey 下载链接:http://ahkscript.org/ 中文帮助站点:h ...
- 二十、oracle通过复合索引优化查询及不走索引的8种情况
1. 理解ROWID ROWID是由Oracle自动加在表中每行最后的一列伪列,既然是伪列,就说明表中并不会物理存储ROWID的值:你可以像使用其它列一样使用它,只是不能对该列的值进行增.删.改操作: ...
- SystemVerilog Assertion 设计、调试、测试总结(3)
上两篇主要是讲述断言的概念,基本语法,总结等等 这一篇主要是以PPT的形式展示各个场景下关于断言的应用. 为了在设计中加入断言的功能,因此需要写一个DUT.如下: `define `define fr ...
- 「USACO5.4」奶牛的电信Telecowmunication
传送门 Luogu 解题思路 题目要求的是最小割点集,考虑用最小割来做. 所有边容量为1,直接求最小割? 这样肯定会出错,比如这种情况: 从最左边的点到最右边的点的最小割为2,但是答案是1,只要破坏中 ...
- 「CF1039D」You Are Given a Tree
传送门 Luogu 解题思路 整体二分. 的确是很难看出来,但是你可以发现输出的答案都是一些可以被看作是关键字处于 \([1, n]\) 的询问,而答案的范围又很显然是 \([0, n]\),这不就刚 ...