【问题标题】:Share ViewModel instance between module in android在android中的模块之间共享ViewModel实例
【发布时间】:2018-08-28 12:56:15
【问题描述】:

我正在研究 MVVM 架构。我想在我的 android 应用程序中的模块之间共享视图模型的实例。当用户从应用程序模块完成骑行时,我想访问我的聊天模块视图模型实例以执行一些数据库操作,即清除对话实体等。我正在使用带有视图模型的房间数据库。 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();
        }
    }

【问题讨论】:

  • 我的问题有什么问题没有人回复???

标签: java android mvvm


【解决方案1】:

理想情况下,您会希望尽可能多地分离这些视图模型。要实现您的目标,您需要一个事件聚合器机制。

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

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

【讨论】:

  • 我尝试过 Stickey EventBus,因为 EventBus 将某种类型的最后一个粘性事件保存在内存中,但我面临的问题是每次订阅方法调用和删除表记录。检查我编辑的问题
猜你喜欢
  • 2019-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-25
  • 2016-03-21
  • 1970-01-01
  • 2023-03-13
  • 2012-03-13
相关资源
最近更新 更多