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 处理的事情
- Request/Check权限
- 访问上下文
- 访问资源
欢迎任何更正、评论或建议,因为我是 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
您不应在 Activity 中设置侦听器。
逻辑应尽可能写入 ViewModel。
前段时间写了一个MVVM(Databinding)的demo
希望对你有帮助:
您可以像在 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 之间的区别
我们公司一直在使用 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 处理的事情
- Request/Check权限
- 访问上下文
- 访问资源
欢迎任何更正、评论或建议,因为我是 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
您不应在 Activity 中设置侦听器。
逻辑应尽可能写入 ViewModel。
前段时间写了一个MVVM(Databinding)的demo
希望对你有帮助:
您可以像在 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 之间的区别