android studio viewo,Android Studio 之 AndroidViewModel

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 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();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值