ReadHub源码阅读笔记(二)dagger+MVP
先来思考一般的MVP模式,view层(活动和碎片)持有一个presenter并实例化,presenter通过构造器或set方法持有view引用。然后view层调用presenter方法,prensenter获取数据后调用view方法(界面操作)完成一次完整响应。
引入dagger后view层不再需要手动实例化presenter,由框架注入即可,这就是区别。
1.首先定义view和presenter的抽象BaseContract:
public interface BaseContract {interface BasePresenter<T extends BaseContract.BaseView> {void attachView(T view);void detachView();}interface BaseView {
presenter通过泛型声明关联的view类型,所需必要操作有获取view引用和解绑。view基本操作这里作者定义了一些网络错误显示进度条等操作,不是必需。
2.接下来看BaseActivity:(fragment一样)
public abstract class BaseActivity<T extends BaseContract.BasePresenter> extends RxAppCompatActivity implements BaseContract.BaseView {@Nullable@Injectprotected T mPresenter;
持有一个presenter实例,并且声明需要注入。然后在onCreate中调用presenter的attachView将自身引用交给presenter。
再定义一个BasePresenter类实现BaseContract.BasePresenter:
public class BasePresenter<T extends BaseContract.BaseView> implements BaseContract.BasePresenter<T> {protected T mView;@Overridepublic void attachView(T view) {this.mView = view;}@Overridepublic void detachView() {if (mView != null) {mView = null;}}
}
这也是方便所有具体presenter不必再实现这两个方法。
3.开始使用:
Base类已经定义完了,接下来以项目中的一个Fragment为例,看看怎么使用。这是一个新闻列表界面,界面向presenter请求显示列表,presenter获取网络数据并调用view的方法更新界面。
首先定义抽象层:
public interface TopicContract {interface View extends BaseContract.BaseView {void updateTopicData(String order, ArrayList<TopicMo> topicMos);}interface Presenter extends BaseContract.BasePresenter<View> {void getTopicNews(String order);}
}
在原有接口上的扩展。
真正的presenter,注释构造器提供注入。由于继承了BasePresenter所以不必实现绑定和解绑方法,view层继承BaseAty和BaseFra不必再实现BaseView的方法也是同理:
public class TopicPresenter extends BasePresenter<TopicContract.View> implements TopicContract.Presenter {@Injectpublic TopicPresenter() {}@Overridepublic void getTopicNews(final String order) {App.apiService(ReadhubApiService.class).apiTopic(order, Constant.TOPIC_PAGE_SIZE).compose(RxSchedulers.<TopicResp>io_main()).compose(mView.<TopicResp>bindToLife()).subscribe(new Consumer<TopicResp>() {@Overridepublic void accept(TopicResp topicResp) throws Exception {if (topicResp != null && topicResp.data != null) {//通知view更新界面mView.updateTopicData(order, topicResp.data);}}}, new Consumer<Throwable>() {@Overridepublic void accept(Throwable throwable) throws Exception {mView.showFailed();}});}
}
然后fragment实现view接口(注意声明presenter类型):
public class TopicFragment extends BaseFragment<TopicPresenter> implements TopicContract.View {
依赖注入:
AndroidSupportInjection.inject(this);
fragment在合适时机调用presenter的getTopicNews方法即可。
ReadHub源码阅读笔记(二)dagger+MVP相关推荐
- werkzeug源码阅读笔记(二) 下
wsgi.py----第二部分 pop_path_info()函数 先测试一下这个函数的作用: >>> from werkzeug.wsgi import pop_path_info ...
- ThreadPoolExecutor源码阅读笔记(二)FutureTask
BlockingQueue: 队列他决定了任务的调度方式,我们主要关注BlockingQueue的offer, poll,take三个方法 offer往队列里面添加任务如果队列已经满了话返回false ...
- 源码阅读笔记 BiLSTM+CRF做NER任务 流程图
源码阅读笔记 BiLSTM+CRF做NER任务(二) 源码地址:https://github.com/ZhixiuYe/NER-pytorch 本篇正式进入源码的阅读,按照流程顺序,一一解剖. 一.流 ...
- 代码分析:NASM源码阅读笔记
NASM源码阅读笔记 NASM(Netwide Assembler)的使用文档和代码间的注释相当齐全,这给阅读源码 提供了很大的方便.按作者的说法,这是一个模块化的,可重用的x86汇编器, 而且能够被 ...
- libreCAD源码阅读笔记1
libreCAD源码阅读笔记1 一 前言: 正如官网(https://www.librecad.org)所说,libreCAD是一个开源的CAD制图软件,可以运行在Windows.Apple.Linu ...
- Live555源码阅读笔记(一):源码介绍文档 及 源码目录结构
目录 一.Live555介绍 1.Live555项目介绍 2.官网及帮助文档介绍 二.源码目录结构 1.UsageEnvironment 2.BasicUsageEnvironment 3.group ...
- dgl源码阅读笔记(3)——DeepWalk
dgl源码阅读笔记(3)--DeepWalk 图神经网络开源库dgl阅读笔记 文章目录 dgl源码阅读笔记(3)--DeepWalk 图神经网络开源库dgl阅读笔记 @[TOC](文章目录) 前言 一 ...
- Transformers包tokenizer.encode()方法源码阅读笔记
Transformers包tokenizer.encode()方法源码阅读笔记_天才小呵呵的博客-CSDN博客_tokenizer.encode
- CI框架源码阅读笔记4 引导文件CodeIgniter.php
到了这里,终于进入CI框架的核心了.既然是"引导"文件,那么就是对用户的请求.参数等做相应的导向,让用户请求和数据流按照正确的线路各就各位.例如,用户的请求url: http:// ...
- Yii源码阅读笔记 - 日志组件
2015-03-09 一 By youngsterxyf 使用 Yii框架为开发者提供两个静态方法进行日志记录: Yii::log($message, $level, $category); Yii: ...
最新文章
- 2021年大数据ZooKeeper(四):ZooKeeper的shell操作
- freemarker基本语法及实例
- LSJ_NHibernate第三章 IDAL,DAL,BLL
- PreparedStatement和CallableStatement都可以调用存储过程
- win10下使用certutil工具对文件的SHA1、MD5和SHA256哈希结果做验证(超简单,附图)
- 第二阶段团队绩效评分
- matlab 二值化_撸了一份 ostu二值化,需要的小伙伴请拿走
- java 项目做多级缓存_【开源项目系列】如何基于 Spring Cache 实现多级缓存(同时整合本地缓存 Ehcache 和分布式缓存 Redis)...
- C语言(CED)最长公共子序列----动态规划第一题
- MySQL之Handler_read_*查看索引使用情况
- html表单如何提示信息,表单提示信息
- 西门子mag6000接线_西门子MAG 5000/6000电磁流量计的使用
- python人脸对比相似度_Python比较两个图片相似度的方法
- 安装SQL 2000 企业版
- python绘图之Times New Roman字体以及Helvetica字体
- Docker 与 K8S学习笔记(二十)—— 使用Downward API向容器注入Pod信息
- c语言棋盘光标怎么删除,删除光标前的字符按什么键
- hMailServer邮件服务下载安装详细步骤、汉化、配置(内含解决.NET Framework和libmysql.dll32位库的问题)
- 7月5号cf服务器维护,cf2015年5月7日维护到几点 cf5月7日更新公告
- iOS开发之 iPhone各种Icon图标尺寸
热门文章
- 【HTML5 基础】HTML5重要内容
- Excel打开CSV文件,数字起始0丢失问题
- ipad上的游戏服务器无响应,教你 game center无法连接服务器解决办法及iOS9.3.2公测版已修复GameCenter无响应bug...
- 学习笔记(13):21天通关Python(视频课)-字典高级用法
- 中职计算机基础辅导书,中职计算机基础 (938)(16页)-原创力文档
- Java 算法之三色旗
- 基于Python的学生求职招聘系统Django企业招聘系统(源码调试+讲解+文档)
- 由syms生成函数,求该函数在某些点的数值
- win10动态壁纸怎么设置_教程丨WIN10系统下设置固定IP或动态IP
- Python实现自动录制虎牙直播