先来思考一般的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相关推荐

  1. werkzeug源码阅读笔记(二) 下

    wsgi.py----第二部分 pop_path_info()函数 先测试一下这个函数的作用: >>> from werkzeug.wsgi import pop_path_info ...

  2. ThreadPoolExecutor源码阅读笔记(二)FutureTask

    BlockingQueue: 队列他决定了任务的调度方式,我们主要关注BlockingQueue的offer, poll,take三个方法 offer往队列里面添加任务如果队列已经满了话返回false ...

  3. 源码阅读笔记 BiLSTM+CRF做NER任务 流程图

    源码阅读笔记 BiLSTM+CRF做NER任务(二) 源码地址:https://github.com/ZhixiuYe/NER-pytorch 本篇正式进入源码的阅读,按照流程顺序,一一解剖. 一.流 ...

  4. 代码分析:NASM源码阅读笔记

    NASM源码阅读笔记 NASM(Netwide Assembler)的使用文档和代码间的注释相当齐全,这给阅读源码 提供了很大的方便.按作者的说法,这是一个模块化的,可重用的x86汇编器, 而且能够被 ...

  5. libreCAD源码阅读笔记1

    libreCAD源码阅读笔记1 一 前言: 正如官网(https://www.librecad.org)所说,libreCAD是一个开源的CAD制图软件,可以运行在Windows.Apple.Linu ...

  6. Live555源码阅读笔记(一):源码介绍文档 及 源码目录结构

    目录 一.Live555介绍 1.Live555项目介绍 2.官网及帮助文档介绍 二.源码目录结构 1.UsageEnvironment 2.BasicUsageEnvironment 3.group ...

  7. dgl源码阅读笔记(3)——DeepWalk

    dgl源码阅读笔记(3)--DeepWalk 图神经网络开源库dgl阅读笔记 文章目录 dgl源码阅读笔记(3)--DeepWalk 图神经网络开源库dgl阅读笔记 @[TOC](文章目录) 前言 一 ...

  8. Transformers包tokenizer.encode()方法源码阅读笔记

    Transformers包tokenizer.encode()方法源码阅读笔记_天才小呵呵的博客-CSDN博客_tokenizer.encode

  9. CI框架源码阅读笔记4 引导文件CodeIgniter.php

    到了这里,终于进入CI框架的核心了.既然是"引导"文件,那么就是对用户的请求.参数等做相应的导向,让用户请求和数据流按照正确的线路各就各位.例如,用户的请求url: http:// ...

  10. Yii源码阅读笔记 - 日志组件

    2015-03-09 一 By youngsterxyf 使用 Yii框架为开发者提供两个静态方法进行日志记录: Yii::log($message, $level, $category); Yii: ...

最新文章

  1. 2021年大数据ZooKeeper(四):ZooKeeper的shell操作
  2. freemarker基本语法及实例
  3. LSJ_NHibernate第三章 IDAL,DAL,BLL
  4. PreparedStatement和CallableStatement都可以调用存储过程
  5. win10下使用certutil工具对文件的SHA1、MD5和SHA256哈希结果做验证(超简单,附图)
  6. 第二阶段团队绩效评分
  7. matlab 二值化_撸了一份 ostu二值化,需要的小伙伴请拿走
  8. java 项目做多级缓存_【开源项目系列】如何基于 Spring Cache 实现多级缓存(同时整合本地缓存 Ehcache 和分布式缓存 Redis)...
  9. C语言(CED)最长公共子序列----动态规划第一题
  10. MySQL之Handler_read_*查看索引使用情况
  11. html表单如何提示信息,表单提示信息
  12. 西门子mag6000接线_西门子MAG 5000/6000电磁流量计的使用
  13. python人脸对比相似度_Python比较两个图片相似度的方法
  14. 安装SQL 2000 企业版
  15. python绘图之Times New Roman字体以及Helvetica字体
  16. Docker 与 K8S学习笔记(二十)—— 使用Downward API向容器注入Pod信息
  17. c语言棋盘光标怎么删除,删除光标前的字符按什么键
  18. hMailServer邮件服务下载安装详细步骤、汉化、配置(内含解决.NET Framework和libmysql.dll32位库的问题)
  19. 7月5号cf服务器维护,cf2015年5月7日维护到几点 cf5月7日更新公告
  20. iOS开发之 iPhone各种Icon图标尺寸

热门文章

  1. 【HTML5 基础】HTML5重要内容
  2. Excel打开CSV文件,数字起始0丢失问题
  3. ipad上的游戏服务器无响应,教你 game center无法连接服务器解决办法及iOS9.3.2公测版已修复GameCenter无响应bug...
  4. 学习笔记(13):21天通关Python(视频课)-字典高级用法
  5. 中职计算机基础辅导书,中职计算机基础 (938)(16页)-原创力文档
  6. Java 算法之三色旗
  7. 基于Python的学生求职招聘系统Django企业招聘系统(源码调试+讲解+文档)
  8. 由syms生成函数,求该函数在某些点的数值
  9. win10动态壁纸怎么设置_教程丨WIN10系统下设置固定IP或动态IP
  10. Python实现自动录制虎牙直播