本篇文章代码引用GitHub上zhihu项目,https://github.com/yiyibb/Zhihu。在这里跟初学者强烈推荐一下,这个项目功能虽然简单,只是一个简单阅读功能,但是我很佩服开发者的代码封装能力,做的真得很完美。采用的是MVP+retrofit+rxjava架构。今天主要看他的架构分析。

MVP

我们在初学android的时候,用的架构都是MVC,何为MVC呢。model,view,control。简单来讲model就是数据层,view就是activity,control就是逻辑处理。

开始学的MVC很容易理解,所有层都能在activity上看到,逻辑也很容易看清。activity能够和model,view两者互相接触。但同时也带来相当的困扰,耦合性太大。你想啊,只要activity改动很容易牵连到方面,而且activity任务量也比较大。

由此从MVC衍生出MVP,MVP很大程度上解决了耦合性的问题,view层不再能直接接触model,我感觉这个应该是最大的亮点。当然还有其他优势,比如更方便进行单元测试等等。具体的网上查一查就明白了。

retrofit+rxjava

一个是网络请求,一个是异步处理,由于本文主要讲架构分析,这些用法不会赘述。推荐读者看一看开发者抛物线的文章。上面说过了我是引用别人的代码,其实刚开始我用的就是MVC开发模式,没有全部按照他的写。很蹩脚,重构代码真的很费劲。当初也只是想切身体验一下两个架构的区别,结果越整越乱,重点是我并不是很熟悉MVP的结构模型。

架构搭建

首先分析一下功能,从api拿到json数据,然后用retrofit开始解析,拿到数据后用rxjava更新UI集合。来看看整体架构,代码是从项目里摘出来的,功能也已经实现,链接如下https://github.com/ZhangPeng0220/MVP_Retrofit_Rxjava

image.png

整体有一个mvp架构放在了 mvp_base文件夹里面,drawerMvp是整体项目的一个侧滑栏模块,DrawerMainContract类里包含了drawer模块需要的model,view,presenter。api是model数据连接,common里也是一些基类。接下来可以分层分析。

Drawer MVP模块

这里主要介绍DrawerMainContract接口类

public interface DrawerMainContract {

interface Model extends BaseModel {

Observable getOtherThemeList();

}

interface View extends BaseView {

void loadOtherThemeList(ThemesEntity themesEntity);

}

abstract class Presenter extends BasePresenter {

abstract void getOtherThemes();

}

}

这里所有最终的实体类,都会实现DrawerMainContract中的接口。比如mainactivity会实现view接口

View

这里的view层显而易见就是mainActivity

public class MainActivity extends BaseFrameActivity implements BaseView, DrawerMainContract.View{

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mPresenter.getOtherThemes();

}

@Override

public void loadOtherThemeList(ThemesEntity themesEntity) {

//处理返回结果

themesEntity.getLimit();

}

}

BaseFrameActivity继承自BaseActivity,除了拥有activity的一般生命周期方法以外,它还主要实现了model和presenter的实例化。

public abstract class BaseFrameActivity

extends BaseActivity implements BaseView{

public P mPresenter;

public M mModel;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

mPresenter = TUtil.getT(this, 0);

mModel = TUtil.getT(this, 1);

if (this instanceof BaseView) {

mPresenter.attachVM(this, mModel);

}

}

@Override

protected void onDestroy() {

/// if (mPresenter != null) mPresenter.detachVM();

super.onDestroy();

}

}

实例化是通过工具类 TUtil实现的,具体代码请读者移步上文的GitHub地址。这里需要注意的有三个点:

第一个是泛型限制,传入的presenter和model都有父类限制。

第二个需要注意的是,在view层只会接触到presenter,不会接触model,为啥这边还要实例化model。这里的model实例其实为presenter准备的。mPresenter.attachVM(this, mModel)这句话是关键。

第三个是baseview这里是空的,这里可以放一些基本的方法,比如initview,initdata

Presenter

public abstract class BasePresenter {

public M mModel;

public V mView;

public void attachVM(V v, M m) {

this.mModel = m;

this.mView = v;

}

public void detachVM() {

//mRxManager.clear();

mView = null;

mModel = null;

}

}

BasePresenter主要用于刚刚view和model的实例化。由于这个类有实体方法并未使用接口。接下来就是DrawerMainContract.Presenter继承了这个抽象方法,具体实现类是DrawerMainPresenter

public class DrawerMainPresenter extends DrawerMainContract.Presenter{

@Override

public void getOtherThemes() {

mModel.getOtherThemeList()

.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(new Subscriber() {

@Override

public void onCompleted() {

}

@Override

public void onError(Throwable e) {

// mView.onRequestError("数据加载失败ヽ(≧Д≦)ノ");

}

@Override

public void onNext(ThemesEntity themesEntity) {

mView.loadOtherThemeList(themesEntity);

}

});

}

}

mModel.getOtherThemeList()这个方法是属于model层的,会返回一个Observable对象,这就属于RxJava的内容了,当得到了具体数据,会在onNext方法里面调用view更新数据的方法,此时mView已经在BaseFrameActivity中的mPresenter.attachVM方法实例化了。

Model

这一层主要是用于连接数据,调用数据。

public class DrawerMainModel implements DrawerMainContract.Model{

@Override

public Observable getOtherThemeList() {

return Networks.getInstance().getThemeApi().getThemes();

}

}

DrawerMainModel实现的接口没啥可讲的,方法可以看一看

public MyService getThemeApi() {

return mThemeApi == null ? configRetrofit(MyService.class) : mThemeApi;

}

private T configRetrofit(Class service) {

retrofit = new Retrofit.Builder()

.baseUrl("http://news-at.zhihu.com")

.client(configClient())

.addConverterFactory(GsonConverterFactory.create())

.addCallAdapterFactory(RxJavaCallAdapterFactory.create())

.build();

return retrofit.create(service);

}

private OkHttpClient configClient() {

OkHttpClient.Builder okHttpClient = new OkHttpClient.Builder()

.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);

return okHttpClient.build();

}

这是network里面的实现方法,getThemeApi()方法主要是拿到myservice的实例,继而调用myservice中的getThemes(),拿到json数据。

总结

整体流程就是上面得了,其实不算难,但是作者的封装风格我比较喜欢。流程图如下。可以看出 和MVC相比较是清晰了很多。

image.png

感兴趣的同学可以关注一下我的微信公众号,或者微信搜索 开发 Android的小学生

公众号.jpg

mvp架构 java_MVP架构基本使用相关推荐

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

    本文转载自https://www.tianmaying.com/tutorial/AndroidMVC,原文作者周鸿博. 和MVC框架模式一样,Model模型处理数据代码不变在Android的App开 ...

  2. 浅谈 MVC、MVP 和 MVVM 架构模式

    2019独角兽企业重金招聘Python工程师标准>>> 谈谈 MVX 中的 Model 谈谈 MVX 中的 View 谈谈 MVX 中的 Controller 浅谈 MVC.MVP ...

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

    转载自: http://www.tianmaying.com/tutorial/AndroidMVC 1.架构设计的目的 通过设计使程序模块化,做到模块内部的高聚合和模块之间的低耦合.这样做的好处是使 ...

  4. 微信架构 支付架构(上)

    微信架构 & 支付架构(上) 一. 微信和支付宝对比 这两者现在已经占领了移动支付的90%市场,支付形式也都大抵相同,只是在实现细节上略微不同.这里之所以要专门对比,是因为有些接口的不同在后边 ...

  5. 移动架构 (一) 架构第一步,学会画各种 UML 图。

    距离上一个 "性能优化系列" 已经快一个月没有发布文章了,最近公司真的是太忙了,甚是想念掘友们啊.最近把学习架构方面的知识记录下来,供自己和掘友们一起学习. 注意: 文章中 UML ...

  6. 微信架构 支付架构(下)

    微信架构 & 支付架构(下) 管理网络请求 首先看看原来 iOS 处理支付网络请求的缺陷: 原来支付的请求,都是通过一个单例网络中心去发起请求,然后收到回包后,通过抛通知,或者调用闭包的方式回 ...

  7. 旧文重发:做人、做事,做架构师——架构师能力模型解析

    这篇文章发表于<程序员>2008.04期.其中有关模型图参见: http://blog.csdn.net/aimingoo/archive/2007/06/26/1667508.aspx ...

  8. 下一代大数据即时分析架构--IOTA架构

    经过这么多年的发展,已经从大数据1.0的BI/Datawarehouse时代,经过大数据2.0的Web/APP过渡,进入到了IOT的大数据3.0时代,而随之而来的是数据架构的变化. ▌Lambda架构 ...

  9. 大数据技术架构_架构大数据图

    大数据管理数据处理过程图 大数据(big data),指无法在一定时间范围内用常规软件工具进行捕捉.管理和处理的数据集合,是需要新处理模式才能具有更强的决策力.洞察力.大数据处理的主要流程包括数据收集 ...

  10. 我要带徒弟学JAVA架构 ( 写架构,非用架构 )

    我要带徒弟学JAVA架构 (写架构,非用架构)     很多人做java开发2,3年后,都会感觉自己遇到瓶颈.什么都会又什么都不会,如何改变困境,为什么很多人写了7,8年还是一个码农,工作中太多被动是 ...

最新文章

  1. 重磅!神策客户服务中心升级,5 年,价值释放加速度
  2. iospython开发工具_使用Python开发iOS程序
  3. 获取IP地址和MAC地址
  4. 使用cron表达式 设置定时任务
  5. JVM判断对象是否存活
  6. css鼠标拖拉卡顿_66个值得收藏的CSS开发技巧
  7. ubuntu18.04 安装惠普打印机驱动和GUI界面
  8. 怎样找一张图片的原图、出处?最全搜图网站+具体案例分享
  9. lvds输入悬空_LVDS布线的一般原则
  10. Shell脚本到底是什么高大上的技术吗?
  11. BeagleBone Black– 智能家居控制系统 LAS - ESP8266 UDP 服务
  12. java 吸血鬼数字(四位数)
  13. 基于JAVA Frame的太阳系行星运转系统
  14. 厦门大学354汉语基础考研参考书目
  15. MATLAB模拟布丰投针实验
  16. 光时域反射仪都有什么功能
  17. 圆角矩形 shader
  18. 数字孪生在制造业的7种应用
  19. 设计模式 with Python 7:适配器模式
  20. ADS的信号完整性和电源完整性仿真应用方案

热门文章

  1. java pdf 转tif_使用java对pdf转成tiff文件
  2. 台式电脑windows10蓝屏代码 SYSTEN_THREAD_EXCEPTION_NOT_HANDLED 失败的操作rtl8188gu.sys
  3. android ios emoji兼容,web端怎么和移动端emoji表情兼容
  4. 华为交换机,登录密码忘记
  5. QT5 配置nPcap过程
  6. CCNA考试题库中英文翻译版及答案3
  7. 使用计算机录制声音10,win10怎么录音的同时录电脑声音怎么办
  8. 计算机技能比赛试题,计算机技能竞赛比赛试题文字录入WORDEXCEL
  9. 3D打印Gcode文件命令详解
  10. Klipper 不支持中文Gcode文件名的解决办法