【问题标题】:Where should I do activity navigation in MVP architecture?在 MVP 架构中我应该在哪里进行活动导航?
【发布时间】:2018-03-08 02:56:03
【问题描述】:

我有一个使用 MVP 架构构建的 Android 项目。我不太确定的一件事是,例如,当我想在单击按钮后导航到另一个活动时,我应该放置

startActivity(intent) 

view 组件内还是在 presenter 组件内?

【问题讨论】:

  • 您应该在此处提供代码示例来说明您的特定模式。哪些组件实际实现了演示者和视图接口?

标签: android mvp android-mvp


【解决方案1】:

您必须在视图组件中执行此操作,所有与 ui 相关的活动都必须在视图中执行,例如打开 new activityreplacing fragment 并要求 permissions

让我进一步解释一下,假设我们的活动中有一个按钮,因此我们将在演示者中编写其逻辑,即调用演示者方法buttonClick(),如果我们想在我们的逻辑之后打开另一个活动,我们只需调用getMvp.openMainActivity(); where as openMainActivity()将是视图的一部分。

这是基于 MVP 架构的基本登录活动的示例方法。 我的 Login Presenter MVP 界面有

  void onServerLoginClick(String email, String password);

我的Login View MVP界面有

void openMainActivity();

我的 Login Presenter 实现是

@Override
    public void onServerLoginClick(String email, String password) {
        //validate email and password
        if (email == null || email.isEmpty()) {
            getMvpView().onError(R.string.empty_email);
            return;
        }
        if (!CommonUtils.isEmailValid(email)) {
            getMvpView().onError(R.string.invalid_email);
            return;
        }
        if (password == null || password.isEmpty()) {
            getMvpView().onError(R.string.empty_password);
            return;
        }
        getMvpView().showLoading();


        User u   = getDataManager().matchUser(new User(2l,"",email,password,"",""));
        if (u==null){
            getMvpView().onError("No user found");
            getMvpView().hideLoading();


        }else {
            getDataManager().updateUserInfo(
                    "",
                    u.getId(),
                    DataManager.LoggedInMode.LOGGED_IN_MODE_SERVER,
                    u.getName(),
                    u.getEmail(),
                    "",
                    password);
            getMvpView().hideLoading();
            getMvpView().openMainActivity();
        }




    }

我的登录视图类实现是

@Override
    public void openMainActivity() {
        Intent intent = MainActivity.getStartIntent(LoginActivity.this);
        startActivity(intent);
        finish();
    }

希望这将帮助您理解这个概念。

【讨论】:

  • 此外,构造 Intent 和使用它启动 Activity 都需要 Context,如果可以避免的话,您不希望显式传递演示者。
  • 是的,您绝对不能从演示者那里打开新活动。
  • 这个答案是基于假设 Activity 是实现视图接口的东西。有些人认为 Activity 应该实现 Presenter 接口。就我个人而言,我不喜欢这样,但你应该清楚。 TL;DR;只有一个 Activity 可以做所有这些事情(启动其他 Activity,处理运行时权限)所以答案是“你的模式的任何部分由 Activity(或 Fragment)实现”
猜你喜欢
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
  • 2017-11-30
  • 1970-01-01
  • 1970-01-01
  • 2020-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多