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中使用生命周期进行数据的管理。