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

What should be done in Activity/Fragment and ViewModel in MVVM

我们公司一直在使用 MVP 模式开发 Android 应用程序。使用 MVP,我们将所有业务逻辑放在 Presenter 中,Activity/Fragment 然后只负责在从 Presenter 接收事件回调时更新视图。

现在,我们决定尝试使用 Android 数据绑定的 MVVM。似乎有了 MVVM,我们可以将所有业务逻辑放在 ViewModel 中(就像 MVP 中的 Presenter 一样),并且还可以将数据模型的任何更改通知视图,所有这些都在一个对象中。

但是,这在我们心中提出了一个问题,我们应该让 Activity/Fragment 处理什么?由于我们采用了MVP模式来避免fat-activity/fragment。我们不想有 slim-activity/fragment 然后 fat-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
    }
}

是的,您可以在 ViewModel 中拥有所有业务逻辑,这里是我个人用来学习 MVVM 的一些链接

Approaching Android with MVVM
https://github.com/ivacf/archi
MVVM on Android: What You Need to Know

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

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

Model - Data model containing business and validation logic
View - Defines the structure, layout and appearance of a view on screen
ViewModel - Acts a link between the View and Model, dealing with any view logic

reference

您不应在 Activity 中设置侦听器。

逻辑应尽可能写入 ViewModel。

前段时间写了一个MVVM(Databinding)的demo

希望对你有帮助:

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

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

public interface MainActivityViewModelListener {
void onUserRefreshed(User user);

适用于 mvp 类型设计,但对于 mvvm,您应该使用适当的观察者注册和注销模式,包括通知观察者。

在mvp中我们直接调用一个接口函数,但是mvvm中的观察者模式与这些简单的接口有很大的不同。观察者模式涉及 Subject 向客户端 class.

注册

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

这是一个简单的应用程序,具有相同的功能,但以三种不同的格式编写,以便清楚地了解 mvp mvvm 和 mvc 之间的区别