Android - MVP 的上下文

Posted

技术标签:

【中文标题】Android - MVP 的上下文【英文标题】:Android - context with MVP 【发布时间】:2017-09-27 02:03:23 【问题描述】:

我要创建一个带有 MVP 实现的简单应用,并尝试在演示者中发出权限请求。要发出权限请求,我需要像这样传递上下文。

        // Location permission has not been granted yet, request it.
        ActivityCompat.requestPermissions(fragmentActivity, new String[]permission, requestId);

我读过几篇文章,他们提到在演示者中使用上下文不是一个好的练习。所以,我只是想知道人们如何使用 MVP 处理权限请求。而且我真的不知道为什么在演示者中使用上下文不是一个好习惯。 请帮助我了解我应该如何处理权限请求以及为什么使用上下文不是好的做法。

谢谢

【问题讨论】:

【参考方案1】:

在实践中存在多种 MVP。我不是在这里开始辩论哪个是对的,哪个是错的。只要特定风格适用于您的场景,就应该使用它。

相反,我将尝试解释为什么应该避免 Presenter 中的上下文以及我在代码中避免使用的一种方法。

您不应该在演示者中拥有上下文的主要原因之一是,可能存在对演示者的引用,这可能会泄漏活动。在我必须处理活动中的上下文的地方,我通过 Views 访问。

interface View 
   Context getContext();


interface Presenter 
   void setView(View view);

因此 PresenterImpl 实现了一个视图,即活动的 onCreate 并将其重置为活动的 onDestroy。所以演示者从不直接掌握上下文。但它拥有视图,它具有关于视图的知识。

【讨论】:

【参考方案2】:

您绝对不能将任何与 android 相关的对象发送到 Presenter 层,并且它们必须完全解耦。

为了做这些事情,我总是记得一句好话,那就是Do not inject objects, inject operations and behavior

很简单,不要将您的上下文注入您的演示者,这是一种错误的做法。而是在您的视图合约(视图接口)中添加一个名为 getPermission() 的函数,然后在您的视图中实现该方法以及您的合约的其他方法,然后在您需要权限时调用该方法。

这是最好的方法。相信我;)

【讨论】:

感谢您回复阿米尔。所以,其他需要上下文的方法,如 getResource 应该在视图(活动或片段)方面,对吧?现在,我的演示者中有另一行从 strings.xml 资源获取字符串数组。但是没有比赛,我无法获得字符串资源,也无法创建字符串。那你怎么办? 当您使用 context.startActivity(intent) 从演示者打开外部应用程序时怎么样?我正在将一个上下文从视图传递给我的演示者并执行 context.startActivity(intent)。 看起来很简单。每一件小事都可以通过接口来完成。在您的演示者层中创建一个包含startSomeActivity()getSomeString() 的接口,然后在您的视图层中实现它们,然后将实现发送给pesenter。然后演示者将在需要时触发操作。 是的,这很简单,只要您需要使用 Context,就让 View 来完成这项工作。但我试图为查看和演示者赋予更明确的角色。 View 只是显示演示者所说的内容。所以,我正在做的是.. Presenter 从模型层和/或资源获取数据。然后演示者创建要显示的字符串。最后,presenter 将这些字符串传递给视图层。 如果它显示状态 pf 应用程序的消息,如“发生错误!”或“连接错误!”它应该在视图层的资源中,并且必须有一些方法,例如 showConnectionError() 视图实现。但是对于其他字符串,例如您从数据库中获得的字符串,字符串的来源是模型,然后是视图的呈现器;)

以上是关于Android - MVP 的上下文的主要内容,如果未能解决你的问题,请参考以下文章

应该将演示者(mvP)注入(dagger2)到android中的视图吗?

在 MVP 模式中,了解活动/上下文的演示者是不是是个坏主意?

谁来讲讲Rxjava,rxandroid中的操作符的作用

谁来讲讲Rxjava,rxandroid中的操作符的作用

谁来讲讲Rxjava,rxandroid中的操作符的作用

Android中的“上下文”是啥意思? [复制]