MVVM中的Activity / Fragment和ViewModel应该做什么

我们公司一直在用MVP模式开发Android应用程序。 使用MVP,我们把所有的业务逻辑放在主持人和活动/片段,然后只是负责视图更新时,从演示者接收事件callback。

现在,我们决定尝试使用Android Databinding的MVVM。 MVVM似乎可以把所有的业务逻辑放在ViewModel中(就像MVP中的Presenter一样),也可以通过一个对象来通知数据模型的任何变化。

但是,这在我们的脑海里提出了问题,我们该如何处理活动/片段呢? 由于我们采用MVP模式来避免脂肪活动/片段 。 我们不希望有苗条活动/片段 ,然后胖视图模型

到目前为止,我们认为我们可以留给活动/片段来处理

  • 请求/检查权限
  • 访问上下文
  • 访问资源

每个更正,评论或build议都是受欢迎的,因为我对MVVM相当陌生,即使它看起来与MVP相似。

谢谢。

多一点问题

将MVVM和监听器(如MVP)结合起来可能吗? 例如

public class MainActivityViewModel extends BaseObservable { MainActivityViewModelListener listener; User user; public void setMainActivityViewModelListener(MainActivityViewModelListener listener) { this.listener = listener; } public void refreshUser(View v) { // some user update via Internet notifyPropertyChanged(BR.userAlias); if (listener != null) { listener.onUserRefreshed(user); } } @Bindable public void getUserAlias() { return user.getAlias(); } } public interface MainActivityViewModelListener { void onUserRefreshed(User user); } public class MainActivity implements MainActivityViewModelListener { MainActivityBinding binding; @Override public void onCreate(Bundle savedInstanceState) { binding = DataBindingUtil.setContentView(R.layout.main_activity); MainActivityViewModel viewModel = new MainActivityViewModel(); viewModel.setMainActivityViewModelListener(this); binding.setMainActivityViewModel(viewModel); } @Override public void onUserRefreshed(User user) { // do some update } } 

Solutions Collecting From Web of "MVVM中的Activity / Fragment和ViewModel应该做什么"

是的,你可以在你的ViewModel中拥有所有的业务逻辑,下面是我个人为了学习MVVM而遵循的一些链接

用MVVM接近Android
https://github.com/ivacf/archi
Android上的MVVM:你需要知道什么

您可以在ViewModel中提及所有监听器以及您的模型将包含的数据。

ViewModel改变了一些内容,并通知绑定框架内容已经改变。

模型 – 包含业务和validation逻辑的数据模型
视图 – 在屏幕上定义视图的结构,布局和外观
ViewModel – 在视图和模型之间起作用,处理任何视图逻辑

在这里输入图像说明

参考

你不应该在活动中设置监听器。

逻辑应尽可能写入ViewModel。

我前一段时间写了一个MVVM(数据绑定)的演示。

希望它可以帮助你:

https://github.com/adgvcxz/Dribbble-MVVM

你的问题的答案,你可以在mvvm里使用接口监听器,就像你在mvp中一样吗? 是的,但模式是一点点不同你提到的代码

 public interface MainActivityViewModelListener { void onUserRefreshed(User user); 

对于MVPtypes的devise是可以的,但对于MVVM你应该使用适当的观察员注册和注销模式,包括通知观察员。

在mvp中,我们直接调用一个接口函数,但是mvvm中的观察者模式与这些简单的接口是完全不同的。 观察者模式涉及客户类的主题注册。

如果你想要如何Mvvm工作看到这里https://github.com/saksham24/Android-Firebase-Mvp-Mvc-Mvvm-chat

这是一个简单的应用程序,具有相同的function,但用三种不同的格式书写,以便清楚地了解mvp mvvm与mvc