【问题标题】:What should be done in Activity/Fragment and ViewModel in MVVMMVVM中的Activity/Fragment和ViewModel应该做什么
【发布时间】:2017-03-22 00:07:49
【问题描述】:

我们公司一直在使用 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
    }
}

【问题讨论】:

    标签: java android mvvm android-databinding


    【解决方案1】:

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

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

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

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

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

    reference

    【讨论】:

    • +1 Github 链接。到目前为止,我浏览了几个教程并尝试了一个实现示例,项目示例将有很大帮助!
    • 嘿! @RaviRupareliya,片段交易和动画应该在Activity上完成?
    【解决方案2】:

    您不应该在 Activity 中设置 Listener。

    应尽可能将逻辑写入 ViewModel。

    前段时间我写了一个 MVVM(Databinding) 的演示。

    希望对你有帮助:

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

    【讨论】:

      【解决方案3】:

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

      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 之间的区别

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-18
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        • 2011-02-23
        • 1970-01-01
        • 2015-12-17
        • 2023-03-23
        相关资源
        最近更新 更多