MailOtto 实现完美预加载以及源码解读
背景:
最近项目组需要一个小课题分享,小白刚好从微博里看到一个这样有趣的开源工具MailOtto,是阿里巴巴员工 Drakeet 维护的一个专注懒事件的事件总线,gitHub地址为:https://github.com/drakeet/MailOtto ,Drakeet的个人地址为:https://drakeet.me/mailotto-sample ,个人觉得挺有用,实用起来很方便,就介绍给大家了,小白在学习的过程中通过研究了源码,明白了作者在最后说的,MailOtto绝不仅仅是能够完美实现预加载,还可以代替startActivityForResult,甚至还有同时拥有 Otto/EventBus 的功能的精髓。
MailOtto使用
借着作者的一个小Demo:在第一个页面预先为第四个页面预加载数据,模拟加载数据的时间需要8S,当我们进入到第四个页面的时候,如果数据还没有加载完成,我们还会继续等待。这样就完美实现了预加载的效果。
第一步:

第二个框框内顺便说了一下,这里用若引用的目的,是为了防止内存泄露,具体原因为:非静态匿名内部类持有一个对外部类的隐士引用,而静态内部类不会,在InnerRunable里面,我们把数据通过Mail这个类把数据传给了目标处理类。这样子我们就可以继续做其他事情了。
第二步:
在目标页面里面只需要一句 Mailbox.getInstance().atHome(this); 说明我已经在等着了,数据快来吧,就行了,如图所示:

第三步:
在不变页面编写处理的方法,就行了,如图所示:

总结MailOtto的使用方法:
1. 子线程里取数据,然后够通过 Mailbox.getInstance().post(new Mail("A mail from MainActivity", TargetActivity.class)); 把数据发送给目标页面,实现预加载效果
2. 在目标页面声明 Mailbox.getInstance().atHome(this); 我已经来到目标页面了,有数据就砸过来吧。
3. 编写唯一一个带有@OnMailReceived 的处理方法来处理数据,结束。
你一定很好奇,这过程是怎么实现的,别急,我们下面看看源码就知道了。下面是源码,如果不喜欢看源码的可以直接略过。
首先是处理方法的编写,在编译的时候,使用发射机制在目标类可以找到对应标识的处理类,只需要一个处理类即可,如果多个的话,在通过遍历找出第一个。

以上就是对MailOtto的基本认识,使用后回发现,这是一个懒事件总线,也是一种消息,订阅机制,其实可以代替startActivityForResult ,据不仅仅用于预加载,可以用于任何时候的数据传递,剩下一大批判断是否完成的操作。
MailOtto 实现完美预加载以及源码解读的更多相关文章
- Webpack探索【16】--- 懒加载构建原理详解(模块如何被组建&如何加载)&源码解读
本文主要说明Webpack懒加载构建和加载的原理,对构建后的源码进行分析. 一 说明 本文以一个简单的示例,通过对构建好的bundle.js源码进行分析,说明Webpack懒加载构建原理. 本文使用的 ...
- Webpack探索【15】--- 基础构建原理详解(模块如何被组建&如何加载)&源码解读
本文主要说明Webpack模块构建和加载的原理,对构建后的源码进行分析. 一 说明 本文以一个简单的示例,通过对构建好的bundle.js源码进行分析,说明Webpack的基础构建原理. 本文使用的W ...
- Volley 图片加载相关源码解析
转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/47721631: 本文出自:[张鸿洋的博客] 一 概述 最近在完善图片加载方面的 ...
- ElasticSearch 启动时加载 Analyzer 源码分析
ElasticSearch 启动时加载 Analyzer 源码分析 本文介绍 ElasticSearch启动时如何创建.加载Analyzer,主要的参考资料是Lucene中关于Analyzer官方文档 ...
- Springboot学习04-默认错误页面加载机制源码分析
Springboot学习04-默认错误页面加载机制源码分析 前沿 希望通过本文的学习,对错误页面的加载机制有这更神的理解 正文 1-Springboot错误页面展示 2-Springboot默认错误处 ...
- Springboot 加载配置文件源码分析
Springboot 加载配置文件源码分析 本文的分析是基于springboot 2.2.0.RELEASE. 本篇文章的相关源码位置:https://github.com/wbo112/blogde ...
- 微服务架构 | *2.3 Spring Cloud 启动及加载配置文件源码分析(以 Nacos 为例)
目录 前言 1. Spring Cloud 什么时候加载配置文件 2. 准备 Environment 配置环境 2.1 配置 Environment 环境 SpringApplication.prep ...
- jQuery实现DOM加载方法源码分析
传统的判断dom加载的方法 使用 dom0级 onload事件来进行触发所有浏览器都支持在最初是很流行的写法 我们都熟悉这种写法: window.onload=function(){ ... } 但 ...
- abp vnext2.0之核心组件模块加载系统源码解析与简单应用
abp vnext是abp官方在abp的基础之上构建的微服务架构,说实话,看完核心组件源码的时候,很兴奋,整个框架将组件化的细想运用的很好,真的超级解耦.老版整个框架依赖Castle的问题,vnext ...
随机推荐
- ABAP ALV 颜色设置(行,列,单元格)
BCALV_EDIT_03 http://blog.sina.com.cn/s/blog_a87b19300102who3.html 关于ALV表格颜色,这种需求在项目中会经常用到. 列颜色 列的颜色 ...
- JavaScript Source Map 详解
源码地址: http://www.ruanyifeng.com/blog/2013/01/javascript_source_map.html 上周,jQuery 1.9发布. 这是2.0版之前的最后 ...
- sgu 101 无向图有双重边的欧拉路径
#include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> ...
- URL是否有效
unit Unit1;interfaceuses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, Syste ...
- Clover
为您的 Windows Explorer 插上翅膀! Clover 是 Windows Explorer 资源管理器的一个扩展,为其增加类似谷歌 Chrome 浏览器的多标签页功能. 方便的 Tab ...
- istringstream
编写程序,将来自一个文件中的行保存在一个vector<string>中,然后使用一个istringstream从vector读取数据成员,每次读取一个单词 #include <ios ...
- Validation
Validation A simple but powerful Validation Engine, in a Laravel-esque style. Its Validation Rules a ...
- multithread synchronization use mutex and semaphore
#include <malloc.h> #include <pthread.h> #include <semaphore.h> struct job { /* Li ...
- 命令行界面下的用户和组管理之useradd和passwd命令的使用
命令行界面下的用户和组的管理之useradd和passwd命令的使用 useradd [-c comment] [-d dir] [-e expire] [-g group] [-G group1,g ...
- Oracle SQL Developer 操作
.新建 数据库连接 菜单->文件->新建 ->新建数据库连接 ->连接名: 用户名:userA 口 令: 连接类型:基本/.. 角色:默认值/SYSDBA 主机名:localh ...