1、MVVM
MVVM(Model-View-ViewModel)是一种代码架构模式,被广泛应用在Android程序设计领域,类似的架构模式还有MVP、MVC等。但是目前Google最为推荐的代码架构模式就是MVVM,甚至Jetpach中的许多组件就是为了便于实现MVVM架构的项目而提供的。也就是说,借助jetpack,我们就可以轻松地编写一个MVVM架构项目了,当然前提是你对jetpack已经比较了解。
2、MVVM层级结构
M:表示的是仓库层,仓库层要做的工作是自主判断接口请求的数据应该是从数据库中读取还是从网络中获取,并将数据返回给调用方。
V:UI控制层,这部分就是我们平时写的Activity和Fragment。
VM:表示的是ViewModel层,ViewModel用于持有和UI元素相关的数据,以保证这些数据在屏幕旋转时不会丢失,以及负责和仓库之间进行通讯。
3、分层结构:
ViewModel
ViewModel类旨在以注重生命周期的方式存储和管理界面相关的数据,ViewModel类让数据可在发生屏幕旋转等配置更改后继续存在。
另一个问题是,界面控制器经常需要进行异步调用,这些调用可能需要一些时间才能返回结果。界面控制器需要管理这些调用,并确保系统在其销毁后清理这些调用以避免潜在的内存泄漏。此项管理需要大量的维护工作,并且在因配置更改而重新创建对象的情况下,会造成资源的浪费,因为对象可能需要重新发出已经发出过的调用。
诸如Activity和Fragment之类的界面控制器主要用于显示界面数据、对用户操作做出相应或处理操作系统通信(如权限请求)。如果要求界面控制器也负责从数据库或者网路加载数据,那么会使类越发膨胀。为界面控制器分配过多的责任可能会导致单个类尝试自己处理应用的所有工作,而不是将工作委托给其他类。以这种方式为界面控制器分配过多的责任也会大大增加测试难度。
从界面控制器逻辑中分离出视图数据所有权的做法更易行且更搞笑。
实现ViewModel
架构组件为界面控制器提供了ViewModel辅助程序类,该类负责为界面准备数据,在配置更改期间会自动保留ViewModel对象,以便它们存储的数据立即可供下一个Activity或Fragment实例使用,例如,如果您需要在应用中显示用户列表,请确保获取和保留该用户列表的责任分配给ViewModel,而不是Activity或Fragment
如MyViewModel:
public class MyViewModel extends ViewModel {
private MutableLiveData<List<String>> users;
public LiveData<List<String>> getUsers(){
if (users == null){
users = new MutableLiveData<>();
loadUsers();
}
return users;
}
private void loadUsers() {
// Do an asynchronous operation to fetch users.
}
}
Activity引用:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyViewModel model = new ViewModelProvider(this).get(MyViewModel.class);
model.getUsers().observe(this, users -> {
// update UI
});
}
}
LiveData
LiveData是一种可观察的数据存储器类。与常规的可观察类不同,LiveData具有生命周期感知能力,意指它遵循其他应用组件(如Activity,Fragment或Service)的生命周期,这种感知能力可确保LiveData仅更新处于活跃生命周期状态的应用组件观察者。
使用LiveData具有以下优势:
1、确保界面符合数据状态:LiveData遵循观察者模式。当生命周期状态发生变化时,LiveData会通知Observer对象。您可以整合代码以在这些Observer对象中更新界面。观察者可以在每次发生更改时更新界面,而不是在每次应用数据发生更改时更新界面。
2、不会发生内存泄漏:观察者会绑定到Lifecycle对象,并在其关联的生命周期遭到销毁后进行自我清理。
3、不会因Activity停止而导致崩溃
4、不再需要手动处理生命周期。
5、数据始终保持最新状态。
6、适当的配置更改。
7、共享资源。
参考:
https://developer.android.google.cn/topic/libraries/architecture/viewmodel
https://developer.android.google.cn/topic/libraries/architecture/livedata