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中使用生命週期進行數據的管理。