Android Studio 之 AndroidViewModel

AndroidViewModel是ViewModel的一個子類,能夠直接調用getApplication(),由此能夠訪問應用的全局資源。java

 在 MyViewModel 這個類中,此類直接繼承自 AndroidViewModel ,平時通常這個類是繼承 ViewModelandroid

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();
    }
}
相關文章
相關標籤/搜索