Android MVP解释

Android MVP explanation

我试图了解编写 "clean" Android 应用程序的最佳方法。我发现了一个有趣的 article,他们使用一种 3 层架构。

现在我读到 android 使用 MVP 设计模式并尝试理解这一点。我理解 MVP 原则(在 android 上下文中)的方式是:

这是正确的吗?

当这是正确的时候,3 层模型完全符合 MVP 原则也是正确的吗 因为:

  1. 3 层架构中的表示层适合 MVP 的表示层
  2. 3 层架构的业务和数据层非常适合 MVP 的模型部分?

我希望我的问题很清楚,因为这对我来说是一个复杂的话题。

也许这让我对这个问题有了清晰的认识(思维方式)..

我想澄清的第一件事是,MVP 或与此相关的任何其他模式并不特定于 Android dev,并且可以应用于任何其他框架。

我想你明白了要点:

  • 视图通常由活动和片段实现,并将包含对演示者的引用
  • 演示者是视图和模型之间的中间人。从模型中检索数据,returns 它已经格式化为视图,因此除了显示它不需要做任何其他事情。
  • 模型可以简单地看作 "data provider"。它可以像你想要的那样复杂,使用内部数据库,大量的类等。

如果您对 Android 应用架构感兴趣,我建议您观看今年在 Android 开发者峰会上发表的演讲。这是我见过的最好的之一

https://www.youtube.com/watch?v=BlkJzgjzL0c

尽管这个问题有答案,但我认为这个答案无论如何都不完整。

MVP 是一个通用概念,可以有许多不同的实现,其中一些有很大的不同。而且,这个概念本身是非常模糊的——当他们说 MVP 时,不同的人可能有不同的概念。最普遍的一种如下图所示:

无论实现如何,MVP 组件的一般定义是:

  • 模型:"application state storage" 的抽象。 "state" 的定义及其存储方式是实现细节。模型实现不应依赖于 View 或 Presenter。
  • 视图:"user interface" 的抽象。 "user" 是谁以及它如何与视图交互的定义是实现细节。 View 实现不应依赖于 Model 或 Presenter。
  • Presenter:封装了应用的业务逻辑。 Presenter 处理从视图接收到的用户输入事件,并更改存储在模型中的应用程序状态作为响应。 Presenter 还处理存储在模型中的应用程序状态的更改,并更新视图作为响应。 Presenter 通常同时依赖于 View 和 Model。

如果您在 Android 开发环境中需要有关 MVP 的更多信息,可以在此 post 中找到:MVP and MVC Architectural Patterns in Android

因为您已经了解了 Clean Architecture 的基础知识。以下示例描述了您的 MVP 模式是如何实际实施的。

示例:

interface BaseContract {
        interface BaseView {
            //Methods for View
            void onDoSomething();
        }

        interface BasePresenter {
            void doSomething();

        }
    }

    class BaseMainPresenter implements BaseContract.BasePresenter {
        BaseContract.BaseView view;

        BaseMainPresenter(BaseContract.BaseView view) {
            this.view = view;
        }

        @Override
        public void doSomething() {
            if (view != null)
                view.onDoSomething();
        }
    }

    class DemoClass implements BaseContract.BaseView {

        //Create object of Presenter 

        /****
         * Example :
         * BaseMainPresenter baseMainPresenter = new BaseMainPresenter(this);
         */
        @Override
        public void onDoSomething() {
            //Deal with Context here.
        }
    }

请参阅下面 link 示例实际实施方案并了解有关 Clean Architecture 的更多信息:https://github.com/android10/Android-CleanArchitecture

这里 github https://github.com/saksham24/Android-Firebase-Mvp-Mvc-Mvvm-chat 我制作了一个包含 3 个具有相同功能但以 3 种不同 android 模式(Mvc、Mvp、Mvvm)

编写的应用程序的存储库

如果我们有一个关于它们的简单好例子,那么理解三种不同的模式就很容易了,所以我做了一个回购协议来为这个开发者社区贡献我的知识。 此外,存储库是使用适当的 java 指南和约定(包括命名和包、模块)编写的,因此寻找此类项目的人也可以查看此存储库。

现在

  1. 如果你想知道android Mvp、Mvc、MvvM 之间的区别,请参阅 realm 的解释 https://academy.realm.io/posts/eric-maxwell-mvc-mvp-and-mvvm-on-android/

  2. 如果你想比较三种模式,请参阅这篇 wonder 完整博客 https://thinkmobiles.com/blog/mvp-vs-mvvm-android-patterns/

Now I read that android uses the MVP design pattern and try to understand this. The way I understand the MVP principle (in the android context) is that:

  • the Model layer are the logic classes

  • the presenter are the classes that are "linked" to an XML (the activities)

  • the passive view are the XML's.

Is this correct?

不完全:对于 Model 层是正确的,但对于 Presenter 则不是。 Presenter 没有链接到 XML,尽管它通过其构造函数引用了 ViewView 是 android.

中的 Activity/Fragment

您可能想查看 here 以获得 android 的示例 MVP 应用程序。

在 android 中实现 MVP 时需要解决的重要问题是 activity 由于后台进程更新关闭而导致内存泄漏和应用程序崩溃的泄漏 activity。

由于 Presenter 引用了 activity,如果无法对 Presenter 进行垃圾回收,activity 将保留在内存中。

这两个问题都可以通过activity或fragment的生命周期方法来解决,并在这些方法中释放资源,从而防止内存泄漏和应用程序崩溃。

清理资源相关的后台工作可以使用RXJava轻松实现,有关MVP和MVP with RXJava的更多信息,请参见http://www.zoftino.com/android-model-view-presenter-mvp-pattern-example

这是在您的应用程序中实现 MVP 模式的最简单方法 android_mvp_login_sample