android mvp知乎,安卓日记——MVP重构知乎日报
在之前安卓日记——手把手教你做知乎日报已经教大家分析和利用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重构知乎日报相关推荐
- android studio mvpplugin,MVPHelper Android Studio 插件,一键生成 MVP 代码接口以及实现类。 @codeKK Android开源站...
一款适用于 Intellij IDEA 和 Android Studio 的插件, 可用于为 MVP 架构生成接口以及实现类, 解放双手. 欢迎 Issue Report, 欢迎 Feature Re ...
- 关于Android封装一个全局的BaseActivity你需要知道的
关于Android封装一个全局的BaseActivity你需要知道的 1.前言 2.特点 3.代码及说明 3.1.优缺点 3.2.代码 3.3.注意点 4.总结 5.最后 1.前言 对于一个Andro ...
- android ui设计 知乎,界面设计进化!知乎日报2.0新版发布下载
[PConline 资讯]"知乎"这个大名几年来在网上可谓风生水起,知乎网的网友来自各行各业,通过知乎这个知识问答社区,往往能够提供一些令人大开眼界的内容.而"知乎日报& ...
- Android L系统 剖析安卓5.0安卓L新特性
Android L系统全新发布了!在Google I/O 2014上,Google正式发布了最新一代安卓系统Android L,安卓系统终于告别了安卓4.×,迈入了全新的版本周期.新一代安卓系统此前一 ...
- Android开发之2048安卓版
之前是在eclipse上写的,后面换成了android sudio. 2048游戏的UI整体可以采用线性布局,即LinearLayout,其中嵌套一个线性布局和一个GridLayout,内嵌的线性布局 ...
- android功能导航布局,安卓9.0新功能 屏幕旋转将与导航栏同窗
中关村在线消息:今天早些时候谷歌向开发者们推送了Android P(也称安卓9.0)的首个开发者预览版,在原先8.0的基础上进一步改进了通知栏,也为刘海屏幕专门进行了优化.意味着未来"刘海& ...
- ffmpeg-win32-v3.2.4 下载_为知笔记安卓版下载 8.1.4
为知笔记app安卓版是一款是一款商务办公的生活服务软件.为知笔记方便你记录下生活中的点点滴滴,以及工作上的相关事宜.支持分享,方便多人接受信息资料,为知笔记致力为用户提供优质的办公环境. 为知笔记软件 ...
- android复位机器人图片,安卓(Android)新图标!小绿机器人换脸啦
作为知名的谷歌开源系统,安卓(Android)占据了手机操作系统的半壁江山.而随着新版本Android 10的发布,一个新的Logo设计方案也随之上线. 新的设计方案不仅重新设计了字体和小机器人图标, ...
- 【Android】虹软、安卓、Uniapp、SpringBoot 实现人脸识别
[Android]虹软.安卓.Uniapp.SpringBoot 实现人脸识别 简要概述 后台使用的是springboot,本地开发集成的是window是的版本,发布到线上需要改成Linux的版本 如 ...
- daliu_IT学习Android笔记第一篇--Android是什么?安卓的logo来源?安卓的发展过程?
Android是什么?安卓的logo来源?安卓的发展过程? 安卓的名字: Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公 ...
最新文章
- 迁移到阿里云后,NTKO控件报存word 报文件存取错误,请检查网络传输。
- 算法谜题 php,JavaScript实现N皇后问题算法谜题解答_javascript技巧
- 计算机 密码学 实验一,计算机网络安全技术-实验一-密码学基础
- VS.net中的远程调试
- 洛谷 P2951 [USACO09OPEN]捉迷藏Hide and Seek
- Elasticsearch集群安装Version6.2.2
- OpenCV4每日一练day10:图像校正
- ai怎么画路线_使用AI画一个离心管
- bootstrap table导出功能无效报错Uncaught INVALID_CHARACTER_ERR: DOM Exception 5和导出中文乱码问题...
- P-Called-Party-ID头域
- S7-200SMART编程软件在符号绝对模式下变量符号名显示不全的解决办法
- 360安全卫士清理C盘
- 竖版1:2500万标准中国地图
- intel 集显 linux 驱动程序,Linux下Intel集成显卡驱动安装
- 5g手机可以用4g的手机卡吗
- uni-app开发微信小程序,H5 关于压缩上传图片的问题
- 自动关闭当前的Fragment返回上一个Fragment该如何实现
- 淘宝商品详情页API接口、淘宝商品销量API接口、淘宝商品列表API接口、淘宝APP详情API接口、淘宝详情API接口
- Java-Mybatis(二): Mybatis配置解析、resultMap结果集映射、日志、分页、注解开发、Mybatis执行流程分析
- centos7下安装mycat2