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

时间:2016-11-08 11:23:50

标签: java android mvvm android-databinding

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

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

但是,在我们的脑海中,这提出了一个问题,我们应该由Activity / Fragment处理什么?因为我们采用MVP模式来避免脂肪活动/片段。我们不希望 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
    }
}

3 个答案:

答案 0 :(得分:7)

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

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

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

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

  

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

enter image description here

reference

答案 1 :(得分:0)

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

逻辑应尽可能写入ViewModel。

我刚才写了一个MVVM(数据绑定)的演示。

希望它可以帮到你:

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

答案 2 :(得分:0)

您的问题的答案是否可以像在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之间的区别