Android MVP解释

时间:2015-12-28 14:32:48

标签: android architecture mvp

我试着了解编程"清洁"的最佳方法。 Android应用。我发现了一个有趣的article,它使用了一种3层架构。

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

  • Model层是逻辑类
  • 演示者是"链接"到XML(活动)
  • 被动视图是XML。

这是正确的吗?

如果这是正确的,然后也正确 3层模型完全符合MVP原则,因为:

  1. 来自3层架构的表示层适合MVP的演示者层
  2. 3层架构的业务和数据层完全适合MVP的模型部分吗?
  3. 我希望我的问题很明确,因为对我来说这是一个复杂的话题。

    也许这清除了我对此的看法(思考方式)...... Maybe this clears up my vision about this...

7 个答案:

答案 0 :(得分:10)

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

我认为你得到了它的要点:

  • 视图通常由活动和片段实现,并包含对演示者的引用
  • 主持人是视图和模型之间的中间人。从模型中检索数据并将其格式化返回到视图,这样它就不需要做任何其他事情而是显示它。
  • 该模型可以以简单的方式看作"数据提供者"。它可以像你想要的那样复杂,使用内部数据库,许多条款等。

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

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

答案 1 :(得分:1)

即使这个问题有答案,我也不认为这个答案是完整的。

MVP是一般概念,可以有许多不同的实现,其中一些实质上有所不同。此外,这个概念本身也很模糊 - 不同的人在谈到MVP时可能会有不同的概念。最常见的一种如下图所示:

enter image description here

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

  • 模型:"应用程序状态存储的抽象"。 "状态"的定义是和它的存储方式是实现细节。模型实现不应该依赖于View或Presenter。
  • 查看:"用户界面"的抽象。 "用户"的定义是和它如何与View交互是实现细节。 View实现不应该依赖于Model或Presenter。
  • Presenter:封装应用程序的业务逻辑。演示者处理从视图接收的用户输入事件,并且响应地改变存储在模型中的应用程序状态。演示者还处理存储在模型中的应用程序状态的更改以及响应中的更新视图。演示者通常依赖于视图和模型。

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

答案 2 :(得分:1)

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

由于演示者引用了活动,因此如果无法对演示者进行垃圾回收,活动将保留在内存中。

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

当您了解Clean Architechure的基础知识时。以下示例描述了您的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.
        }
    }

请参阅以下链接以获取示例实际实施方案&了解有关Clean Architechure的更多信息:https://github.com/android10/Android-CleanArchitecture

答案 5 :(得分:0)

这里是github https://github.com/saksham24/Android-Firebase-Mvp-Mvc-Mvvm-chat  我制作了一个包含3个具有相同功能的应用程序的repo,但是用3种不同的android模式编写(Mvc,Mvp,Mvvm)

如果我们在它们上面得到一个简单的好例子,那么理解三种不同的模式是非常容易的,所以我做了一个回购来向我的开发者社区贡献我的知识。 此外,存储库是使用适当的java准则和约定(包括命名和包,模块)编写的,因此寻找此类项目的人也可以查看此存储库。

现在

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

  2. 如果你想比较三种模式,请看这个奇迹的完整博客https://thinkmobiles.com/blog/mvp-vs-mvvm-android-patterns/

答案 6 :(得分:0)

  

现在我读到android使用MVP设计模式并尝试   明白这一点。我理解MVP原理的方式(在   android context)是:

     
      
  • 模型层是逻辑类

  •   
  • 演示者是"链接"到XML(活动)

  •   
  • 被动视图是   XML' S。

  •   
     

这是对的吗?

不完全:对于 Model 层,它是真的,但对于 Presenter 则不是。 Presenter 未链接到XML,尽管它通过其构造函数引用了 View 查看是android中的Activity / Fragment

您可能需要查看here以获取适用于Android的示例MVP应用。