在之前安卓日记——手把手教你做知乎日报已经教大家分析和利用API做出一个简单的知乎日报,源码在github上也收到了5个star

最近我一直很想用一下一直很玄乎的MVP,主要参照谷歌的todo-mvp-rxjava

然后我就想不如就把知乎日报用MVP重构一下吧

我理解中的MVP,以数据库或者网络请求作为M(通常多个共用,所以不单独写)一个Fragment或者Activity作为V,然后把之前的业务逻辑都写在P里。

有人把P当作老板,去指使M和V

而我认为V才是大BOSS,V中创建P,然后把些粗活累活都交给P,P把数据获取外包给M,然后V说我只要看到结果,接收到P传来的结果,就心满意足了

项目可以按照模块分包(登录功能,注册功能……),也可以按照组件分包(P分一类,V分一类……)

我模仿谷歌的todo-mvp-rxjava采用模块分包

这里写图片描述

我看过很多mvp的项目,他们很多是按组件分包的,而且他们都没有一个Contract

在我看来Contract是很有必要的,有了它把职责的分明了,互相调用的方法暴露出来,这样开发的目的会更加明确,分工也更加简单

事不宜迟,现在开始讲如何进行重构

我假设你们都已经懂得如何用我之前的方法做一个知乎日报

1.分析功能模块

这里主要有首页和详情页两个模块

2.写基类

基类不仅节省代码,提高效率,这个不用说了吧

public interface BasePrecenter {

void subscribe();

void unsubscribe();

}

public interface BaseView {

void setPrecenter(T precenter);

}

3.写Contract

Contract中可以不包含M,因为M通常都是公用的,所以单独放,我这Service就是M,主要是网络请求数据

public interface ArticleContract {

interface View extends BaseView{

void showAtrticleDetail(String content);

}

interface Precenter extends BasePrecenter{

void loadArticleDetail(int id);

}

}

4.写Bean和Model

确定好数据的格式和获取的方式

我这里采用的是用retrofit获取数据

public interface ActionService {

public static String baseUrl="http://news-at.zhihu.com";

//今日头条

@GET("/api/4/news/latest")

Observable getLatestNews();

//互联网安全

@GET("/api/4/theme/10")

Observable getSafety();

//不准无聊

@GET("/api/4/theme/11")

Observable getInterest();

//体育日报

@GET("/api/4/theme/8")

Observable getSport();

//传入id查看详细信息

@GET("/api/4/news/{id}")

Observable getNewsDetails(@Path("id") int id);

}

5.然后再写P和V

V中创建P,创建P需要传入V

//创建P传入V

precenter=new HomePrecenter(this);

setPrecenter(precenter);

P中绑定V,并且创建M

public HomePrecenter(HomeContract.View view){

//绑定V

this.view=view;

//创建M

service= ServiceFactory.createRetrofitService(ActionService.class,ActionService.baseUrl);

}

之后主要是一些互相调用Contract中约定好的方法

补充:

P中有subscribe和unsubscribe方法可以与V中的onResume和onPause方法绑定

这样V开始时继续P的业务,暂停时停止P的逻辑

@Override

public void onResume() {

super.onResume();

precenter.subscribe();

}

@Override

public void onPause() {

super.onPause();

precenter.unsubscribe();

}

}

P中将要执行的业务都添加进CompositeSubscription中,unsubscribe时把CompositeSubscription清空掉

subscription.add(rootBean

.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(new Subscriber() {

@Override

public void onCompleted() {

}

@Override

public void onError(Throwable e) {

}

@Override

public void onNext(RootBean rootBean) {

view.showArticle(rootBean.getStories());

}

}));

@Override

public void unsubscribe() {

subscription.clear();

}

重构后竟然一次通过了,太兴奋了

效果图

这里写图片描述

android mvp知乎,安卓日记——MVP重构知乎日报相关推荐

  1. android studio mvpplugin,MVPHelper Android Studio 插件,一键生成 MVP 代码接口以及实现类。 @codeKK Android开源站...

    一款适用于 Intellij IDEA 和 Android Studio 的插件, 可用于为 MVP 架构生成接口以及实现类, 解放双手. 欢迎 Issue Report, 欢迎 Feature Re ...

  2. 关于Android封装一个全局的BaseActivity你需要知道的

    关于Android封装一个全局的BaseActivity你需要知道的 1.前言 2.特点 3.代码及说明 3.1.优缺点 3.2.代码 3.3.注意点 4.总结 5.最后 1.前言 对于一个Andro ...

  3. android ui设计 知乎,界面设计进化!知乎日报2.0新版发布下载

    [PConline 资讯]"知乎"这个大名几年来在网上可谓风生水起,知乎网的网友来自各行各业,通过知乎这个知识问答社区,往往能够提供一些令人大开眼界的内容.而"知乎日报& ...

  4. Android L系统 剖析安卓5.0安卓L新特性

    Android L系统全新发布了!在Google I/O 2014上,Google正式发布了最新一代安卓系统Android L,安卓系统终于告别了安卓4.×,迈入了全新的版本周期.新一代安卓系统此前一 ...

  5. Android开发之2048安卓版

    之前是在eclipse上写的,后面换成了android sudio. 2048游戏的UI整体可以采用线性布局,即LinearLayout,其中嵌套一个线性布局和一个GridLayout,内嵌的线性布局 ...

  6. android功能导航布局,安卓9.0新功能 屏幕旋转将与导航栏同窗

    中关村在线消息:今天早些时候谷歌向开发者们推送了Android P(也称安卓9.0)的首个开发者预览版,在原先8.0的基础上进一步改进了通知栏,也为刘海屏幕专门进行了优化.意味着未来"刘海& ...

  7. ffmpeg-win32-v3.2.4 下载_为知笔记安卓版下载 8.1.4

    为知笔记app安卓版是一款是一款商务办公的生活服务软件.为知笔记方便你记录下生活中的点点滴滴,以及工作上的相关事宜.支持分享,方便多人接受信息资料,为知笔记致力为用户提供优质的办公环境. 为知笔记软件 ...

  8. android复位机器人图片,安卓(Android)新图标!小绿机器人换脸啦

    作为知名的谷歌开源系统,安卓(Android)占据了手机操作系统的半壁江山.而随着新版本Android 10的发布,一个新的Logo设计方案也随之上线. 新的设计方案不仅重新设计了字体和小机器人图标, ...

  9. 【Android】虹软、安卓、Uniapp、SpringBoot 实现人脸识别

    [Android]虹软.安卓.Uniapp.SpringBoot 实现人脸识别 简要概述 后台使用的是springboot,本地开发集成的是window是的版本,发布到线上需要改成Linux的版本 如 ...

  10. daliu_IT学习Android笔记第一篇--Android是什么?安卓的logo来源?安卓的发展过程?

    Android是什么?安卓的logo来源?安卓的发展过程?   安卓的名字: Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公 ...

最新文章

  1. 迁移到阿里云后,NTKO控件报存word 报文件存取错误,请检查网络传输。
  2. 算法谜题 php,JavaScript实现N皇后问题算法谜题解答_javascript技巧
  3. 计算机 密码学 实验一,计算机网络安全技术-实验一-密码学基础
  4. VS.net中的远程调试
  5. 洛谷 P2951 [USACO09OPEN]捉迷藏Hide and Seek
  6. Elasticsearch集群安装Version6.2.2
  7. OpenCV4每日一练day10:图像校正
  8. ai怎么画路线_使用AI画一个离心管
  9. bootstrap table导出功能无效报错Uncaught INVALID_CHARACTER_ERR: DOM Exception 5和导出中文乱码问题...
  10. P-Called-Party-ID头域
  11. S7-200SMART编程软件在符号绝对模式下变量符号名显示不全的解决办法
  12. 360安全卫士清理C盘
  13. 竖版1:2500万标准中国地图
  14. intel 集显 linux 驱动程序,Linux下Intel集成显卡驱动安装
  15. 5g手机可以用4g的手机卡吗
  16. uni-app开发微信小程序,H5 关于压缩上传图片的问题
  17. 自动关闭当前的Fragment返回上一个Fragment该如何实现
  18. 淘宝商品详情页API接口、淘宝商品销量API接口、淘宝商品列表API接口、淘宝APP详情API接口、淘宝详情API接口
  19. Java-Mybatis(二): Mybatis配置解析、resultMap结果集映射、日志、分页、注解开发、Mybatis执行流程分析
  20. centos7下安装mycat2

热门文章

  1. google code的使用方法
  2. 【STM32技巧】使用STM32 HAL库的硬件I2C驱动RX8025T实时时钟芯片
  3. [中医经络学习一]足阳明胃经
  4. C++实现金山打字通助手
  5. 手机电视标准对峙激化
  6. mapabc地图开发之定位篇(GPS+谷歌基站定位+高德基站定位)
  7. autorunner测试java_AutoRunner自动化测试工具
  8. layabox使用初体验
  9. python opencv图像对比度_OpenCV基础(四)---图像对比度,亮度调整
  10. Linux内核学习书籍