zoukankan      html  css  js  c++  java
  • Android开发-浅谈架构(一)

    写在前面的话

    嗯 聊聊架构。 这段时间一直在维护旧项目。 包括自己之前写的新项目 越来越发现 一个架构清晰的项目往往让人赏心悦目。不至于在一个bug丢过来之后手足无措。包括以后别人接收自己的项目 能很快上手 何乐而不为呢?

    曾经的”MVC”

    先从我们曾经的 “MVC” 说起, “MVC” 全名 “Model View Controller”.
    即 视图层(View), 控制层(Controller),模型层(Model).
    他们之间的关系 如图:

    视图层(View) 一般由 xml布局文件担任
    控制层(Controller) 一般由 activity和fragment 担任
    模型层 (Model) 一般指的是 抽离出来的接口扩展。 尝尝可以复用的那一部分。 你只需要把接口 在Controller 抛出。 更新 View即可。

    写到这里 我们知道android中 Controller 控制层一般有Activity(主要)和fragment 担任。但是activity类中 常常包含一些ui 初始化 或者 网络 第三方sdk 的初始化。这样写起代码 activity类就会变得臃肿。而且不够优雅。那么MVP就诞生了:

    MVP

    MVP 是从MVC 中演变过来的。即:Model(模型层) View(视图层) Presenter(主要作为View和model交互的一个纽带 扮演 “主持交互”的角色。处理交互逻辑。)关系如图:

    大家看这个图 也许不是很清楚或者说不是太理解。
    在这里 “View” 由presenter中的接口担任 实现向View实现类通信,你也可以在Android组件中实现它。有时最好直接使用Activity,Fragment或自定义View。>The view that receives commands from a presenter in MVP, is referred to as “view”

    先说Model: 它是一个负责管理数据的接口。模型的职责包括使用API、缓存数据、管理数据库等。该模型也可以是一个接口,与其他模块负责这些职责的沟通。例如,如果您使用的是存储库模式,则该模型可能是一个存储库。如果您使用的是干净的建筑,相反,该模型可以关联。(翻译过来略显生硬 简而言之 Model层是数据访问层,如数据库API或远程服务器API)

    Presenter:大家可以看到Model和View是完全没有交互的。那么 Presenter则担当Model与View之间的中间人。你所有的业务逻辑都属于它。Presenter负责查询模型和更新视图,响应用户交互更新模型。

    先说Model: 它是一个负责管理数据的接口。模型的职责包括使用API、缓存数据、管理数据库等。该模型也可以是一个接口,与其他模块负责这些职责的沟通。例如,如果您使用的是存储库模式,则该模型可能是一个存储库。如果您使用的是干净的建筑,相反,该模型可以关联。(翻译过来略显生硬 简而言之 Model层是数据访问层,如数据库API或远程服务器API)

    Presenter:大家可以看到Model和View是完全没有交互的。那么 Presenter则担当Model与View之间的中间人。你所有的业务逻辑都属于它。Presenter负责查询模型和更新视图,响应用户交互更新模型。

    View:The view can be implemented by Activities, Fragments, any Android widget or anything that can do operations like showing a ProgressBar, updating a TextView, populating a RecyclerView and so on.(这个翻译起来有点尴尬 感觉大家应该都能看懂)

    官方给的代码片段说明:

    在写MVP模型之前 我们有必要搞清楚这样几个问题:

    1. 什么是 “View”
    2. 怎么写Model
    3. 如何理解View 界面 等
    4. 如何写Presenter 并且完成很好的交互 解耦

    参考这篇文章 作者写的很明白 我就不做多余的描述

    其实网上大部分讲解都是套三者之间的关系交互图来讲的。只有理解了尝试敲几遍就差不多会了。另外 符合项目需要的才是最好的。下面我尝试着动手仿照 ONE 一个app将MVP模式套入其中练手(项目会不断完善的 架构 分包开始)

    先截个图 看一下目前大致的结构。
    Dagger2+RxJava+Retrofit

    没用到Presenter之前 HomeActivity中:


    fragmentUtil.switchTo(OneFragment.class); radioGroup.setOnCheckedChangeListener((group1, checkedId) -> { switch (checkedId) { case R.id.home_one: fragmentUtil.switchTo(OneFragment.class); break; case R.id.home_reading: fragmentUtil.switchTo(ReadingFragment.class); break; case R.id.home_music: fragmentUtil.switchTo(MusicFragment.class); break; case R.id.home_movie: fragmentUtil.switchTo(MovieFragment.class); break; default: break; } });

    Presenter实现 

    if(presenter==null)
    presenter = new MainTabPresenter(this, mBinding.radio);
    presenter.switchTo();
    


    代码排版不是很好。
    github地址Dagger2+Retrofit+RxJava
    简单的逻辑代码交由Presenter 和Model协作实现。可能表述 和理解的不是太好 欢迎指正。Demo架构Dagger2+RxJava+Retrofit 雏形已经大致出现 后面会陆续补充一些使用的小技巧 和 第三方的插入 譬如 微信热修复 等等吧。谢谢大家~

    参考:

    MVC vs. MVP vs. MVVM on Android

    Android App的设计架构:MVC,MVP,MVVM与架构经验谈

    官方MVP Dagger2示例

    等等 分享几个免费的api(侵删 谢谢)
    干货Api

    和风天气

    ONE一个接口

    欢迎加群:
    QQ 群 521039620
    简书博客地址

  • 相关阅读:
    C中的system函数
    结构体数组
    转载--C++的反思
    oracle临时表空间
    oracle行转列,列转行
    oracle查询表结构语句
    实例化内部类
    Java非静态内部类为什么不能有静态成员
    oracle显示转换字段类型cast()函数
    linux中vim常用命令
  • 原文地址:https://www.cnblogs.com/yizuochengchi2012/p/6812812.html
Copyright © 2011-2022 走看看