【16課】Android Studio 之 【數據存儲與還原的總結】AndroidViewModel+SharedPreferences+LiveData


SharedPreferences+LiveData結合的方式,會比較好,重啟數據會保存操作記錄!

 

LiveData:能夠自動監聽更新界面上的控件!

SharedPreferences:數據永久化保存,保存在硬件上(只能保存簡單的數據:如字符串、布爾值、數值型等等)

AndroidViewModel:可以直接在這個類里面訪問context或getApplication()

SavedStateHandle:存儲的生命周期比較長,但是如果重啟系統或應用被殺死,數據會丟失。 

 

ViewModel中通過SharedPreferences保存到硬件上的數據,會比較耗性能

可以放在Activity后台中onpause()事件中

 

==========================================

 

 

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

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM