在Android中的模块之间共享ViewModel实例

时间:2018-08-28 12:56:16

标签: java android mvvm

我正在研究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();
        }
    }

1 个答案:

答案 0 :(得分:0)

理想情况下,您希望尽可能地取消这些视图模型的耦合。为了实现您想要做的事情,您需要一个事件聚集器机制。

在您的示例中,您的聊天模块将订阅“ NowSave”类型的事件,而您的应用程序模块将在需要保存数据时发布“ NowSave”类型的事件。

在Android世界中,EventBus看起来像是用于这种机制的流行库: http://greenrobot.org/eventbus/