Android - MVP架构中的Context意义

4

我正在创建一个使用MVP实现的简单应用程序,并尝试在Presenter中进行权限请求。要进行权限请求,我需要像这样传递上下文。

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

我已经阅读了几篇文章,它们都提到在Presenter中使用Context并不是一个好的做法。因此,我想知道人们如何在MVP中处理权限请求。同时我也不清楚为什么在Presenter中使用Context不是好的惯例。请帮助我理解如何处理权限请求以及为什么在Presenter中使用Context不是好的惯例。
谢谢。
2个回答

4

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

为了做到这些事情,我总是记住一句好话,那就是不要注入对象,注入操作和行为

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

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


谢谢回复,Amir。所以,像getResource这样的其他上下文所需方法应该在视图(Activity或Fragment)端,对吗?现在,我在我的Presenter中有另一行代码,它从strings.xml资源获取字符串数组。但是如果没有上下文,我无法获取字符串资源并创建字符串。在这种情况下,你会怎么做? - swordartist
当您使用context.startActivity(intent)从presenter打开外部应用程序时,会怎么样呢?我将上下文从视图传递到我的presenter,并执行context.startActivity(intent)。 - swordartist
1
看,这是多么简单。每一个小事情都可以通过接口来完成。在你的Presenter层创建一个包含startSomeActivity()getSomeString()的接口,然后在你的View层实现这些接口,再将实现发送给Presenter。然后Presenter会在需要时触发这些操作。 - Amir Ziarati
是的,这很容易,每当您需要使用上下文时,让视图来完成工作。但我试图为视图和Presenter赋予更清晰的角色。视图只是显示Presenter所说的内容。因此,我的做法是...Presenter从模型层和/或资源获取数据。然后,Presenter创建要显示的字符串。最后,Presenter将这些字符串传递给视图层。 - swordartist
如果是用于显示应用程序状态的消息,例如 "发生错误!" 或者 "连接错误!",应该放在视图层的资源文件中,并且视图层必须实现一些方法,比如 showConnectionError()。而对于从数据库获取的其他字符串,源自模型,然后由表示器传递给视图层 ;) - Amir Ziarati

1

实际上,MVP有多种不同的实现方式。我并不想开始一场关于哪种方式是对的或者错误的争论。只要某种特定的方式适用于你的场景,就应该使用它。

相反地,我将尝试解释为什么应该避免在Presenter中使用上下文,并介绍我在代码中避免使用上下文的方法之一。

在Presenter中不应该有上下文的主要原因之一是可能会泄露Activity的引用。在我必须处理Activity中的上下文的情况下,我通过View来进行访问。

interface View {
   Context getContext();
}

interface Presenter {
   void setView(View view);
}

PresenterImpl实现了一个视图,在活动的onCreate中重置它,在活动的onDestroy中销毁它。因此,Presenter从不直接持有上下文。但是它持有具有关于视图的知识的视图。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接