我正在研究MVVM体系结构。我想在我的Android应用程序中的模块之间共享视图模型的实例。当用户完成从应用程序模块的行驶时,我想访问我的聊天模块视图模型实例以执行一些数据库操作,即清除会话实体等。我正在使用带有视图模型的Room Database。 ChatActivityNew是聊天模块中的活动。
应用程序模块预订活动
Dialogs.INSTANCE.showRideStatusDialog(mCurrentActivity, new View.OnClickListener() {
@Override
public void onClick(View v) {
Dialogs.INSTANCE.dismissDialog();
Dialogs.INSTANCE.showLoader(mCurrentActivity);
ChatActivityNew.setMukamalListener(iMukamalCallback);
dataRepository.requestEndRide(mCurrentActivity, driversDataHandler);
}
}
聊天模块ChatActivityNew
/**
* Set the Mukamal Callback listener & call onMukamal abstract
* method which takes Message view model as a parameter.
*
* @param iMukamalCallback is a callback listener.
*/
public static void setMukamalListener(IMukamalCallback iMukamalCallback) {
mukamalCallback = iMukamalCallback;
mukamalCallback.onMukamal(mModel);
}
mModel为空,因为尚未加载活动,而MessageViewModel为空,所以我如何访问MessageViewModel的实例。
我遵循了android开发人员文档 https://developer.android.com/topic/libraries/architecture/viewmodel
任何帮助将非常可贵。
编辑
Dialogs.INSTANCE.showRideStatusDialog(mCurrentActivity, new View.OnClickListener() {
@Override
public void onClick(View v) {
Dialogs.INSTANCE.dismissDialog();
Dialogs.INSTANCE.showLoader(mCurrentActivity);
EventBus.getDefault().postSticky(
new MessageEvent(com.example.chatmodule.utils.Constants.RIDE_COMPLETE)
);
dataRepository.requestEndRide(mCurrentActivity, driversDataHandler);
}
}
聊天模块订阅方法
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void onMessageEvent(MessageEvent event) {
if (mModel != null && event.message.equalsIgnoreCase(RIDE_COMPLETE)){
mModel.deleteConversation();
mModel.deleteMessages();
}
}
答案 0 :(得分:0)
理想情况下,您希望尽可能地取消这些视图模型的耦合。为了实现您想要做的事情,您需要一个事件聚集器机制。
在您的示例中,您的聊天模块将订阅“ NowSave”类型的事件,而您的应用程序模块将在需要保存数据时发布“ NowSave”类型的事件。
在Android世界中,EventBus
看起来像是用于这种机制的流行库:
http://greenrobot.org/eventbus/