(三)Android Jetpack 組件之ViewModel

1、概述

ViewModel是一個類,負責準備和管理Activity或Fragment的數據。它還處理活動/片段與應用程序其餘部分的通信(例如,調用業務邏輯類)。
ViewModel的目的是獲取並保留Activity或Fragment所需的信息。活動或片段應能夠觀察ViewModel中的更改。ViewModel通常通過LiveData或Android數據綁定公開此信息。
ViewModel的唯一責任是管理UI的數據。它永遠不應該訪問您的視圖層次結構,也不應該保留對活動或片段的引用。

2、ViewModel的生命週期

在這裏插入圖片描述
可以看到,ViewModel 生命只有兩部分組成:Scope,onCleared()。
當在Scope範圍時,會一直在貫穿在Activity的非OnDestory()之前的生命週期內,當執行OnDestory()時會先調用onCleared() 方法。
在這裏插入圖片描述

3、如何使用ViewModel

使用採用最新的API:
在App的build.gradle文件導入:

implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'

先創建一個對象類NewUser.class

import androidx.databinding.ObservableField;

/**
 * Created by Administrator
 * on 2020/3/27
 */
public class NewUser {
    public final ObservableField<String> name = new ObservableField<>();

    public NewUser(String name) {
        this.name.set(name);
    }
}

再創建一個ViewModel開頭的類,繼承ViewModel

import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

import com.hb.mvvm.viewmodel.entity.NewUser;

/**
 * Created by Administrator
 * on 2020/3/27
 */
public class UserViewModel extends ViewModel {
    public MutableLiveData<NewUser> getUserLiveData() {
        return userLiveData;
    }
	
    MutableLiveData<NewUser> userLiveData = new MutableLiveData<>();

    public UserViewModel() {
        // trigger user load.
        Log.d(UserViewModel.class.getSimpleName(), "===========UserViewModel()");
    }

    @Override
    protected void onCleared() {
        super.onCleared();
        Log.d(UserViewModel.class.getSimpleName(), "===========onCleared()");
    }
}

注意:類中用到了MutableLiveData,這個是LiveData的一個派生類。LiveData與ViewModel是經常搭配在一起使用的。下一章會介紹LiveData的知識點。
現在我們只需要知道:可以利用MutableLiveData觀測整個實體類或者數據類型發送變化時進行通知。

使用ViewModel類

import android.os.Bundle;
import android.util.Log;

import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;

import com.hb.mvvm.R;
import com.hb.mvvm.databinding.ActivityViewModelBinding;
import com.hb.mvvm.viewmodel.entity.NewUser;

public class ViewModelActivity extends AppCompatActivity {

    ActivityViewModelBinding dataBinding;
    NewUser myNewUser;
    UserViewModel viewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(ViewModelActivity.class.getSimpleName(), "========onCreate()");
        myNewUser = new NewUser("小明");

        dataBinding = DataBindingUtil.setContentView(this, R.layout.activity_view_model);
        viewModel = new ViewModelProvider(this).get(UserViewModel.class);
        viewModel.getUserLiveData().observe(this, new Observer<NewUser>() {
            @Override
            public void onChanged(NewUser newUser) {
                dataBinding.setName(newUser.name.get());
            }
        });
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(ViewModelActivity.class.getSimpleName(), "========onResume()");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(ViewModelActivity.class.getSimpleName(), "========onPause()");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(ViewModelActivity.class.getSimpleName(), "========onStart()");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d(ViewModelActivity.class.getSimpleName(), "========onRestart()");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(ViewModelActivity.class.getSimpleName(), "========onStop()");
        myNewUser.name.set("李四");
        viewModel.getUserLiveData().setValue(myNewUser);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(ViewModelActivity.class.getSimpleName(), "========onDestroy()");
    }
}

輸出結果:
在這裏插入圖片描述
從結果可以看出viewModel的生命週期與本文第二節中的圖是吻合的。

4、總結

因本文屬於一些列文章,暫時先不去關心ViewModel具體怎麼應用到項目中,我們先關注怎麼使用它,知道它能幫助我們恢復數據,可以更好的在Activity和Fragment中使用生命週期進行數據的管理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章