问题标签 [android-mvp]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
451 浏览

android - 使用 Android 注释、Mockito 和 MVP 模式时的单元测试

直到昨天,我才使用 MVP 模式和Android Annotations 库成功地组合了一个可读性很强的 Android 项目。

但是昨天当我开始为我的 LoginPresenter 编写 unittest 时,问题就出现了。

首先是我的 LoginPresenter 中的一些代码。

我的测试:

问题是我没有使用使用 MVP 模式的标准方法,而是尝试了 Android Annotations 以使代码更具可读性。所以我没有使用 attachView() 或 detachView() 方法将我的演示者附加到我的 LoginActivity(视图)。这意味着我不能嘲笑我的“观点”。有人知道这个问题的解决方法吗?运行测试时,我不断收到以下消息:

解决方案(我不再使用@RootContext):

主持人:

我的测试(其中一些):

0 投票
8 回答
4229 浏览

android - 内容提供者是存储库模式的实现吗?

存储库模式Hieatt 和 Rob Mee定义为使用类似集合的接口访问域对象在域和数据映射层之间进行调解的设计模式。

MSDN 存储库模式

基本上,它将一个或多个 I/O 设备(云、磁盘、数据库等)抽象为一个通用的类集合接口,您可以在其中读取、写入、查找和删除数据

Fernando Cejas 的 Android Clean Architecture中,应用程序所需的所有数据都来自该层,通过存储库实现(接口位于域层中),该存储库实现使用存储库模式,其策略通过工厂选择不同的数据源,具体取决于一定条件下。

内容提供商

然而,正如Douglas Schmidt教授在Coursera 课程中所指出的那样,内容提供者管理和调解对一个或多个应用程序的中央数据存储库的访问。

内容提供商

Programming Android一书中,内容提供者被用作RESTful Web 服务的外观。这种方法最初是由 Virgil Dobjanschi 在 Google I/O 2010 期间提出的。

因此,与其使用内容提供者来访问本地 SQLite 数据库,为什么不将其用作存储库模式本身呢?

在此处输入图像描述

0 投票
1 回答
3243 浏览

android - Dagger 2 范围活动上下文问题

我正在尝试按照此模板进行 MVP/Dagger2/RxJava 项目。

我无法将 Activity 上下文注入到我的演示者中,因为我知道子组件可以开放访问所有父提供的逻辑,所以其他所有注入都会通过。

应用程序组件构建在 Application 类中,然后在基础 Presenter 活动中访问,然后注入 Presenter 和其余部分的相关依赖项。配置持久化组件主要用于保存演示者状态。

如果我只是手动将上下文从活动传递给演示者,则违背了 DI 的目的。

我试图为所有组件和模块添加范围,以确保可以从图中正确访问依赖项,但这没有奏效。

我正在尝试使用上下文的构造函数注入,我实际上在演示者与之通信的活动中接收到上下文,但演示者没有,会引发错误。所以我想知道为什么活动可以访问活动上下文但演示者没有。

任何指导将不胜感激。

错误

我的组件/模块如下所示:

应用程序组件

应用模块

配置持久化组件

活动组件

活动模块

应用类

主讲者

基本演示者活动

主要活动

/********** 编辑 **********/

为了帮助为演示者保存状态并仍然允许传入活动上下文,我的解决方案发布在下面。欢迎任何反馈。

/*********编辑 - 21_5_17 *********/

例外:

登录活动

登录活动演示者

登录演示者存储

应用组件

活动组件

配置持久组件

活动模块

编辑

我错误地使用了与活动模块相同的活动上下文。因此,我无法将活动注入演示者。将活动模块更改为原始@peractivity 范围并遵循以下答案将使活动上下文可注入。

0 投票
2 回答
515 浏览

android - The model layer (MVP) should use the Activity reference

How can I make a proper separation between the Model layer and the View layer, when I have an operation in the Model that needs the current activity instance?

For example, I've integrated Linkedin SDK in my Android app (written in MVP). In the auth process I have the following code snippet, when init() method's first argument type is Activity:

If my Model layer should get to know Android framework components, what options do I have left to preserve the MVP architecture clean?

0 投票
2 回答
124 浏览

android - 如何改变已经开发的android项目的结构?

我只是一个初学者,在开发时我对遵循架构一无所知,但现在我遇到了许多很棒的架构和框架,我可以遵循这些架构和框架来使代码干净且易于维护......所以我有3个问题

1)改变已经开发的项目以遵循特定的结构或框架(如 MVP 和 MVVM)是否明智。

2)如果第一个问题是,需要多长时间(我知道这取决于项目规模,但仍是粗略估计)

3)哪种架构更适合改变结构。(我已经浏览了许多文档和堆栈溢出的比较问题。但在这里我想改变整个结构。那么哪一个最适合这个)

0 投票
1 回答
33 浏览

android - 对改造调用的取消进行单元测试

我正在尝试编写一个单元测试来测试 Retrofit 调用的取消,但我被卡住了。

这是实现:

这是我到目前为止在我的测试课中得到的:

我的问题是如何停止执行 mockCall 并验证我是否已成功取消?我最好的选择是我必须以某种方式使用 CountDownLatch,但我以前从未使用过它,也无法在任何地方找到并回答如何在我的用例中使用它。

0 投票
2 回答
834 浏览

android - 具有多个数据源的 Android、MVP、Dagger 2 和 Retrofit

我有三个数据源:

  • 一个 JSON API
  • Github
  • XML 清单

我正在使用 Retrofit 和 OkHttp 等来访问所有这些:

  • JSON API 使用 Gson 反序列化
  • XML Manifest 返回一个字符串,我将对其进行反序列化
  • Github 返回一个我显示的字符串

JSON 和 XML 将使用相同的实体进行反序列化。因此,我想将我的 MVP 代码编写得足够抽象,以至于它只需要实体。

所以,我为此写了一个接口

所以,我的 Presenters 和 Interactors 可以简单地调用这些方法,它应该取决于实际使用 Repository 的实现。

然而,这就是我卡住的地方。我不确定使用 Dagger 2 执行此操作的最佳方法。我确信它适用于此用例,但我正在努力弄清楚在哪里/如何执行此操作。

我说得对吗?存储库和反序列化轻松地存在于 MVP 模型中。所有这些都应该发生在那里,Presenter 层可能相对不知道正在使用哪个存储库?

我会展示更多代码,但它非常混乱,我现在很难抽象成一种更易读的方式。

编辑:

这是一个 Gist,其中包含我到目前为止的一些实现:https ://gist.github.com/MatthewBooth/e3dd7a1f3a19fa0fd18e811752170be6

0 投票
1 回答
1153 浏览

android - Android 上的嵌套 MVP:如何

我正在开发一个由 3 个主要部分组成的 Android 测试项目,每个部分都按照MVP 模式开发。这些部分相互嵌套,我想知道我遵循的策略是否正确/最好

结构:

  • Book:包含不同页面的 ViewPager
  • 页面:包含多个项目的自定义线性布局
  • 项目:自定义视图(在这个例子中是一个简单的按钮)

每个部分都使用 MVP 结构(例如,对于 Book,我制作了 BookPresenter、BookView 和 BookModel,Page 和 Item 也是如此)

作为一个用户案例,我想跟踪用户点击按钮的次数,每次将页面背景更改为随机颜色,当用户点击第 10 次时,告诉 BookPresenter 转到第二页。

为此,我设置了一些东西

  • BookView 创建 BookPresenter,而 BookPresenter 又创建每个 PageView。
  • 每个 PageView 创建 PagePresenter 依次创建 ItemView(最终创建 ItemPresenter)

在这一切中,BookPresenter 引用了 PagePresenter,PagePresenter 引用了 ItemPresenter,因此当需要执行某些操作时,它们可以与结构中的子 Presenter 或父 Presenter 进行通信

现在的问题是: 这是建立具有嵌套 MVP 的系统的正确方法吗?因为如果我想拥有一个 PageView 但不是在 Book 中,我需要将它放在 Newspaper 中(其他类与 Book 有一些替代行为)我仍然需要重新创建与 Presenters 和所有其余部分的整个依赖链...

0 投票
0 回答
458 浏览

android - FirebaseAuth.getInstance() 在 FirebaseModule 中返回 null

我正在使用 Model-View-Presenter 方法开发我的应用程序。我也在使用 Dagger2 并创建了这个模块:

这是我可以更新演示者的模型:

问题是注入

返回NullPointerException。我读过这个 getInstance() 必须在 的onCreate()方法中完成MainActivity,但在这种情况下,它破坏了 MVP 方法,因为视图逻辑必须是被动的。

那么在这种情况下我该怎么办?

谢谢

0 投票
1 回答
183 浏览

android - Dagger2如何使用构造函数注入

我已经阅读了有关 Dagger2 的更多信息,我发现它类似于Butterknife,因为当我需要使用它时,我创建了一个模块,并使用:

使用,例如,这个:

但我不明白如何使用构造函数注入。我有一个案例(使用模型视图演示者):

这是对的吗?还是我需要这样做?

因为如果我使用第二个代码,在我的活动(视图)中我需要这样做:

那么如何构建 Presenter 呢?或者如果我需要在 Activity 中创建它,从视图中传递模块是否正确?

编辑:这些是我的模型:

}

谢谢