AndroidViewModel是ViewModel的一个子类,可以直接调用getApplication(),由此可以访问应用的全局资源。

在 MyViewModel 这个类中,此类直接继承自 AndroidViewModel ,平时一般这个类是继承 ViewModel

public class MyViewModel extends AndroidViewModel {
然后在 MyViewModel 这个类中,可以直接用 getApplication()这个方法,访问全局资源文件了
getApplication().getResources().getString(R.string.shp_name);
通过 SavedStateHandle 与 LiveData 配合 自动更新控件数据
通过 SharedPreferences 对数据进行 持久化 存储!关机后再开机,之前数据状态还会显示 1. MyViewModel 类
package com.example.androidviewmodeltest;

import android.app.Application;
import android.content.Context;
import android.content.SharedPreferences; import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.SavedStateHandle; public class MyViewModel extends AndroidViewModel { //方法1. 本类继承自 ViewModel public class MyViewModel extends ViewModel
//通过 context 外部类,就可以直接对 SharedPreferences 进行访问
/*Context context;
void test(){
//通过 context 外部类,就可以直接对 SharedPreferences 进行访问
context.getSharedPreferences("",Context.MODE_PRIVATE);
}*/ //Application application; SavedStateHandle handle;//需要在 build.gradle中引用 implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:1.0.0-alpha01' //这个类继承自AndroidViewModel 就可以直接访问: getApplication().getResources().getString(R.string.buttonJia);//这样就可以直接访问全局资源文件了
String key = getApplication().getResources().getString(R.string.dataKey);
String shpName = getApplication().getResources().getString(R.string.shp_name);
//方法2. 继续自 AndroidViewModel public class MyViewModel extends AndroidViewModel
public MyViewModel(@NonNull Application application, SavedStateHandle handle) {
super(application);
//getApplication().getResources().getString(R.string.buttonJia);//这样就可以直接访问全局资源文件了
this.handle = handle;
if(!handle.contains(key))
load();
} //public 整个项目均方法可见
//private 只能在本类中方法可见
//protected 本类或子类可见
//没有前缀,即不写的话,在本包中的类都可见, 例如在 MainActivity中访问load()这个方法 myViewModel.load();
public LiveData<Integer> getNumber(){
return handle.getLiveData(key);
} void load(){
SharedPreferences shp = getApplication().getSharedPreferences(shpName,Context.MODE_PRIVATE);
int x = shp.getInt(key,0);
handle.set(key,x);
} void save(){
SharedPreferences shp = getApplication().getSharedPreferences(shpName,Context.MODE_PRIVATE);
SharedPreferences.Editor editor = shp.edit();
editor.putInt(key,getNumber().getValue());
editor.apply();
} public void add(int x){
handle.set(key,getNumber().getValue()+x);
//save();//如果装饰save() 操作放这里,会频繁保存数据,可能会影响性能
} }

  

2. MainActivity 类
package com.example.androidviewmodeltest;

import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.SavedStateVMFactory;
import androidx.lifecycle.ViewModelProviders; import com.example.androidviewmodeltest.databinding.ActivityMainBinding; public class MainActivity extends AppCompatActivity {
MyViewModel myViewModel;
ActivityMainBinding binding; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main); // myViewModel.application = getApplication();
// myViewModel.context = getApplicationContext(); //context是比较顶层的类, binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
myViewModel = ViewModelProviders.of(this,new SavedStateVMFactory(this)).get(MyViewModel.class);
binding.setData(myViewModel);
binding.setLifecycleOwner(this); } //在 onPause 事件中操作保存,性能比较好,不频繁操作保存记录
//但是如果手机突然没电或重启,可能会导致此方法没调用成功
@Override
protected void onPause() {
super.onPause();
myViewModel.save();
}
}

  

 

Android Studio 之 AndroidViewModel的更多相关文章

  1. Android Studio配置 AndroidAnnotations——Hi_博客 Android App 开发笔记

    以前用Eclicps 用习惯了现在 想学学 用Android Studio 两天的钻研终于 在我电脑上装了一个Android Studio 并完成了AndroidAnnotations 的配置. An ...

  2. Android Studio 多个编译环境配置 多渠道打包 APK输出配置

    看完这篇你学到什么: 熟悉gradle的构建配置 熟悉代码构建环境的目录结构,你知道的不仅仅是只有src/main 开发.生成环境等等环境可以任意切换打包 多渠道打包 APK输出文件配置 需求 一般我 ...

  3. Android Studio —— 重装 HAXM

    Android Studio -- 重装 HAXM 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. Android SDK 自带模拟器一直以慢.卡 ...

  4. android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测

    目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. (原创:转载声明出处:http://www.cnblogs.com/lin ...

  5. 使用 Android Studio 检测内存泄漏与解决内存泄漏问题

    本文在腾讯技术推文上 修改 发布. http://wetest.qq.com/lab/view/63.html?from=ads_test2_qqtips&sessionUserType=BF ...

  6. 【详细教程】论android studio中如何申请百度地图新版Key中SHA1值

    一.写在前面 现在越来越多的API接口要求都要求提供我们的项目SHA1值,开发版目前还要求不高,但是发布版是必定要求的.而目前定位在各大APP中也较为常见,当下主流的百度地图和高德地图都在申请的时候会 ...

  7. 【走过巨坑】android studio对于jni调用及运行闪退无法加载库的问题解决方案

    相信很多小伙伴都在android开发中遇到调用jni的各种巨坑,因为我们不得不在很多地方用到第三方库so文件,然而第三方官方通常都只会给出ADT环境下的集成方式,而谷歌亲儿子android studi ...

  8. android studio你可能忽视的细节——启动白屏?drawable和mipmap出现的意义?这里都有!!!

    android studio用了很久了,也不知道各位小伙伴有没有还在用eclipse的,如果还有,楼主真心推荐转到android studio来吧,毕竟亲儿子,你会知道除了启动速度稍微慢些,你找不到一 ...

  9. 解决Android Studio 无法显示Layout视图问题

    在Android Studio 当中,如果你选择的SDK的版本 与你所显示的视图版本不一致时,会出现这个错误 Exception raised during rendering:com/android ...

随机推荐

  1. 在Windows10 安装 Linux 子系统

    在工作中我们经常需要在Windows中安装Linux系统来完成一些工作,通常使用VMware.virtualpc,Hyper-V等虚拟化技术来实现,Now,我们有了更便利的方法来实现,这就是Windo ...

  2. 深入解析 Go 中 Slice 底层实现

    原文: https://halfrost.com/go_slice/   切片是 Go 中的一种基本的数据结构,使用这种结构可以用来管理数据集合.切片的设计想法是由动态数组概念而来,为了开发者可以更加 ...

  3. Qt keyevent学习笔记

    在按下一个键不放后,会发生: 1.触发keypressevent(),此时isautorepeat()返回false: 2.set isautorepeat(),使其返回值为true; 3.触发key ...

  4. Node.js自动本地重启服务器

    node.js在本地项目中,更新 了代码 是不会自动刷新 的,要重启才能生效,每次更改代码又手动重启这样很麻烦. 可以安装 个supervisor.全局安装supervisor npm install ...

  5. iOS开发工具:Alcatraz、SVGKit、Lin以及Transformifier等

    转自:http://www.cocoachina.com/applenews/devnews/2013/0606/6352.html Alcatraz:Xcode包管理器 Alcatraz是一个开源的 ...

  6. element表格的滚动条在合计上边

    默认滚动条是在下边的,不好看,这里改一下 修改样式.完美解决: .el-table { overflow-x: auto; } .el-table__header-wrapper, .el-table ...

  7. 周黑鸭借力MES,推进智能生产

    1.项目背景介绍 中国食品企业在经过了一些年的行业整体快速增长后,国家对食品行业的管理提出了更加严格的要求,控制更严,准入门槛提高,企业数量成下降趋势. 大中型食品企业已经需要走出国门,走向国际市场, ...

  8. pytorch报错:ValueError: Expected more than 1 value per channel when training, got input size torch.Size([1,512,1,1])

    1.pytorch报错:ValueError: Expected more than 1 value per channel when training, got input size torch.S ...

  9. nc用法

    NC 在客户端 和 服务器执行------------------------------------------------------------------------------------- ...

  10. C#中的函数(二) 有参有返回值的函数

    接上一篇 C#中的函数(-) 无参无返回值的函数 http://www.cnblogs.com/fzxiaoyi/p/8502613.html 这次研究下C#中的函数(二) 有参有返回值的函数 依然写 ...