在MVVM中,Activity/Fragment和ViewModel应该做些什么?

11

我们公司使用MVP模式开发Android应用已经有一段时间了。使用MVP,我们将所有业务逻辑放进presenter中,而Activity/Fragment则只负责在接收到来自presenter的事件回调时更新视图。

现在,我们决定尝试使用Android Databinding来使用MVVM。看起来,使用MVVM,我们可以把所有的业务逻辑都放在ViewModel中(就像MVP中的Presenter一样),并且还可以通过一个对象通知视图对数据模型进行任何更改。

但是,这也引发了一个问题,什么应该留给Activity/Fragment去处理呢?因为我们采用了MVP模式以避免臃肿的Activity/Fragment。我们不想拥有瘦的Activity/Fragment臃肿的ViewModel

到目前为止,我们认为我们可以留给Activity/Fragment处理的内容包括:

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

欢迎任何更正、评论或建议,因为我对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
    }
}
3个回答

9

你可以把所有的业务逻辑放在ViewModel中,以下是我个人学习MVVM时遵循的一些链接:

使用MVVM接近Android
https://github.com/ivacf/archi
Android上的MVVM:您需要知道的内容

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

ViewModel修改某些内容并通知绑定框架内容已更改。

Model - 包含业务逻辑和验证逻辑的数据模型
View - 定义屏幕上视图的结构、布局和外观
ViewModel - 充当View和Model之间的链接,处理任何 视图逻辑

enter image description here

参考资料


这是Github链接。我已经研究了几个教程并尝试了一个实现示例,项目示例将非常有帮助! - Tar_Tw45
嘿!@RaviRupareliya,片段事务和动画应该在Activity上完成吗? - george_mx

0

你不应该在Activity中设置Listener。

尽可能将逻辑写入ViewModel中。

我之前写了一个MVVM(Databinding)的演示。

希望能对你有所帮助:

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


0

关于你的问题,即在MVVM中是否可以像MVP一样使用接口监听器?答案是肯定的,但模式略有不同。你提到的代码

public interface MainActivityViewModelListener {
void onUserRefreshed(User user);

对于MVP类型的设计,这样做是可以的,但对于MVVM,您应该使用适当的观察者注册和取消注册模式,并通知观察者。

在MVP中,我们直接调用接口函数,但在MVVM中,观察者模式与这些简单接口非常不同。观察者模式涉及主题向客户类注册。

如果您想了解MVVM的工作原理,请参见此处 https://github.com/saksham24/Android-Firebase-Mvp-Mvc-Mvvm-chat

这是一个简单的应用程序,具有相同的功能,但以三种不同的格式编写,以清楚地说明MVP,MVVM和MVC之间的区别


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接