广告
返回顶部
首页 > 资讯 > 移动开发 >关于Android MVP模式的思考
  • 211
分享到

关于Android MVP模式的思考

mvp模式Android 2022-06-06 12:06:01 211人浏览 安东尼
摘要

  这一周对现有的Android项目进行了框架重构,使用MVP模式来重新构建整个项目和包结构。来总结一下我在这个过程中理解和实践吧。   MVP概述   MVP是指Mo

  这一周对现有的Android项目进行了框架重构,使用MVP模式来重新构建整个项目和包结构。来总结一下我在这个过程中理解和实践吧。   MVP概述   MVP是指Model,View和Presenter的缩写,是mvc模式的一种改进版。MVP是一种非常适合Android应用的开发模式,它将把逻辑相关代码从presentation Layer中分离出去 ,所以,所有界面应该显示什么和界面如何显示这些是相互分离的, 在理想状态下,MVP模式可以随意切换视图显示的形式。   但是,需要首先声明的是,MVP并不是 一个框架模式 ,它只负责presentation Layer。在Android项目中,还可能存在Domain Layer和Data Layer,它们分别负责业务逻辑和数据存储。关于三个layer的讨论,可以查看 clear Architecture 。

  The presenter   The presenter充当的是view和model模块中间人的角色。它从model模块获得数据并发送给view模块。 但是不同于MVC,presenter模块也决定用户和界面交互时界面如何响应 。   The View   View模块,一般由Activity或者Fragment实现,每个View实例一般都包含一个presenter实例的引用,并负责实例化presenter。理想情况下,你可以使用dagger来实现依赖注入。view的任务是当用户操作界面时,调用presenter实例的功能来进行响应。   The Model   在设计良好的分层架构中,model应该只是domain layer和业务逻辑的入口,比如说, clear architecture 。但是你也可以把所有界面显示无关的逻辑都作为model。   MVP示例   关于MVP架构的实例有很多,比如 Google官方架构 。这里我给出一下我重构项目一个模块的类图,然后大致说一下实现。

  首先定义了 BaseView 和 BasePresenter 两个接口,实现了 BaseActivity 和 BaseFragment 两个基础类。需要注意的是,因为每个View都需要持有一个特定类型的presenter对象,所以,在 BaseView 定义时,使用了范型。除此之外,你可以在 initPresenter 函数中构造出所需要的presenter对象。 showLoading 和 stopLoading 函数是所有视图进行网络数据加载时所需要的方法,其具体使用场景后边可以看到,这里这两个接口是在 BaseActivity 中实现的。   public interface BaseView<T> {   void showLoading();   void stopLoading();   void initPresnter();   T getPresenter();   }   public interface BasePresenter {   }   public class BaseActivity extends Activity{   public void showLoading() {   }   public void stopLoading() {   }   }   public class BaseFragment extends Fragment {   public void showLoading() {   }   public void stopLoading() {   }   }   然后是data模块中的相关类和接口的定义。我们在 DataContract 接口中定义所有相关的view和data。   public interface DataContract {   interface DataView extends BaseView<DataPresenter> {   void showFragment(BaseFragment fragment);   }   interface DataPresenter extends BasePresenter {   void switchToDataList();   void switchToDataTree();   }   interface DataListView extends BaseView<DataListPresenter> {   void showDataList(List<String> data);   }   interface DataListPresenter extends BasePresenter {   void loadDataList();   }   interface DataTreeView extends BaseView<DataTreePresenter> {}   interface DataTreePresenter extends BasePresenter {}   }   在 DataContract 接口中,我们可以清晰的看到这个模块中所有的view和presenter类型和他们的接口。这样无疑可以帮助其他程序员快速了解本模块的业务逻辑。下面,我们来看一下 DataListFragmnet 和 DataListPresenter 的实现。   public class DataListFragment extends BaseFragment implements DataContract.DataListView {   private DataContract.DataListPresenter mPresenter;   @Override   public void initPresnter() {   mPresenter = new DataListPresenter(this);   }   @Override   public DataContract.DataListPresenter getPresenter() {   return mPresenter;   }   @Override   public void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   initPresnter();   //需要加载数据或者接收到界面点击事件时,调用presenter接口进行初始化或者响应。   mPresenter.loadDataList();   }   @Override   public View onCreateView(LayoutInflater inflater, ViewGroup container,   Bundle savedInstanceState) {   return inflater.inflate(R.layout.fragment_data_list, container, false);   }   @Override   public void showDataList(List<String> data) {   //将数据传给adapter等数据展示的视图   }   }   public class DataListPresenter implements DataContract.DataListPresenter {   private DataContract.DataListView mView;   public DataListPresenter(DataContract.DataListView view) {   super();   this.mView = view;   }   @Override   public void loadDataList() {   //调用baseview的接口,这些接口实现在baseFragment或者BaseActivity中   mView.showLoading();   //getdata from network   mView.stopLoading();   mView.showDataList(Arrays.asList("a","b","c"));   }   }   上述代码中有很多可以好好思考的地方。首先是 showLoading 和 stopLoading 这两个函数。这两个函数接口定义在 BaseView ,实现在 BaseFragment ,所以当 DataListFragment 继承了 BaseFragment 并且实现了 BaseView 时,它并不需要再次定义上述两个接口,毕竟在一个app中,网络加载时的laoding动画一般都是一致的。然后是view和presenter之间函数调用的问题。首先,view在需要初始化或者需要处理点击事件时,需要调用presenter的函数,而不是自己来进行处理。而且二者之间的数据传递必须是presenter调用view的接口传递给view数据,而不是view调用presenter接口获得数据然后自己展示。


--结束END--

本文标题: 关于Android MVP模式的思考

本文链接: https://www.lsjlt.com/news/28603.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 关于Android MVP模式的思考
      这一周对现有的Android项目进行了框架重构,使用MVP模式来重新构建整个项目和包结构。来总结一下我在这个过程中理解和实践吧。   MVP概述   MVP是指Mo...
    99+
    2022-06-06
    mvp模式 Android
  • 关于Android中工作者线程的思考
      在Android中,我们或多或少使用了工作者线程,比如Thread,AsyncTask,HandlerThread,甚至是自己创建的线程池,使用工作者线程我们可以将耗时...
    99+
    2022-06-06
    线程 Android
  • 关于Java栈与堆的思考
    关于Java栈与堆的思考[@more@]  1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。   2. 栈的优势是,存取速度比堆要快,仅次于直...
    99+
    2023-06-03
  • 关于Python课程的一些思考。
    出于对网络爬虫的好奇,我选修了Python程序设计,至于pyhton还能干啥还不太清除,只觉得爬一些数据很有意思,所以希望老师讲一些数据分析之类的技术。学完课程希望能分析一些数据,比如:还有: 上课的话希望快速讲完基础知识(语法什么的),...
    99+
    2023-01-30
    课程 Python
  • Android开发中关于获取当前Activity的一些思考
    在Android开发过程中,我们有时候需要获取当前的Activity实例,比如弹出Dialog操作,必须要用到这个。关于如何实现由很多种思路,这其中有的简单,有的复杂,这里简单...
    99+
    2022-06-06
    activity android开发 Android
  • 关于Diablo3的历史和现状思考
    大菠萝3已经通了,用巫医基本没难度,玩游戏的过程中引发了一些思考,结合整个游戏的历史背景设定,总觉得不写出来就缺点什么。我是暴雪的忠实粉丝,暴雪每款游戏我都玩了,包括早期Dos下的失落的维京人。简单介绍一下,Diablo是暴雪的一个ARPG...
    99+
    2023-01-31
    现状 历史
  • 关于Python构建微服务的思考(一)
    一:什么是微服务?   微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。 系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。 每个微服务仅关注于完成一件任务并很好地完成该任务。 在所有情况下,每个任务代表着一个小...
    99+
    2023-01-31
    Python
  • 关于golang中死锁的思考与学习
    目录1、Golang中死锁的触发条件1.1 书上关于死锁的四个必要条件的讲解1.2 Golang 死锁的触发条件1.3 golang 中阻塞的场景2、死锁案例讲解2.1 案例一:空 ...
    99+
    2023-03-19
    golang 死锁
  • 关于大数据服务上云的思考
    大数据服务上云是指将传统的大数据处理和分析工作,通过云计算平台进行部署和管理。这种方式能够带来许多优势,例如弹性扩展、高可用性、灵活...
    99+
    2023-09-22
    大数据
  • 详解MVP模式在Android开发中的应用
    一、MVP介绍  随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责。为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数据的...
    99+
    2022-06-06
    mvp模式 android开发 Android
  • 关于keras多任务多loss回传的思考
    如果有一个多任务多loss的网络,那么在训练时,loss是如何工作的呢? 比如下面: model = Model(inputs = input, outputs = [y1, y...
    99+
    2022-11-12
  • Android MVP模式ListView中嵌入checkBox的使用方法
    MVP模式 ListView中嵌入checkBox的使用 本文写的是一个小demo,如何在ListView中嵌入checkBox配合使用,本篇文章与前面的嵌入Button类似,...
    99+
    2022-06-06
    checkbox 方法 listview Android
  • 高可用 | 关于 Xenon 高可用的一些思考
    原创:知数堂 上一篇文章,我们详细介绍了 Xenon 实现 MySQL 高可用架构的常用操作。本篇将对关于 Xenon 高可用的一些思考及高频问题进行解答。 问题 1:宕机时 binlog 有 gap 会补日志吗? Xenon 不会...
    99+
    2016-01-28
    高可用 | 关于 Xenon 高可用的一些思考
  • 关于对async await效率问题的深入思考
    关于async await async await于ES2017标准引入,本身的功能是作为语法糖简化写法的。 下面列举一个使用promise的例子: function myProm...
    99+
    2022-11-13
  • 关于JS中的作用域中的问题思考分享
    目录作用域全局作用域作用域中的错误局部作用域with弊端数据泄露性能下降letconst作用域链闭包闭包对作用域链的影响匿名函数的赋值使用let作用域 作用域,也就是我们常说的词法作...
    99+
    2022-11-13
  • 关于vuex更新视图引发的一些思考详析
    目录场景解决总结扩展vuex可以集中式存储管理应用的所有组件的状态,当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高...
    99+
    2022-11-13
  • 关于读写锁算法的Java实现及思考是怎么样的
    本篇文章给大家分享的是有关关于读写锁算法的Java实现及思考是怎么样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。问题背景:多个线程对一个共享的资源进行读写访问。写线程之间需...
    99+
    2023-06-17
  • 关于MySQL死锁检测机制参数innodb_deadlock_detect设置的一点思考
      微信公众号中(这里)看到一个关于MySQL的innodb_deadlock_detect与并发相关的细节,觉得比较有意思,也即innodb_deadlock_detect这个参数的设置问题 死锁检测是一个MySQL Serv...
    99+
    2020-06-09
    关于MySQL死锁检测机制参数innodb_deadlock_detect设置的一点思考
  • PHP中单例模式的线程安全性问题思考
    在PHP编程中,单例模式是一种常用的设计模式,它可以确保一个类只有一个实例,并且提供一个全局的访问点来访问这个实例。然而,在多线程环境下使用单例模式时,需要考虑线程安全性的问题。单例模式的最基本实现包括一个私有的构造函数、一个私有的静态变量...
    99+
    2023-10-21
    单例模式 PHP编程 线程安全性
  • 关于Android10 暗黑模式的简述
    前言 Android 10系统增加了暗黑模式,但是并没有像IOS那样强制适配。暗黑模式下可大幅减少耗电量。而且在晚上使用手机的情况下可以有效的保...
    99+
    2022-06-06
    Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作