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 ...
随机推荐
- 好记心不如烂笔头,ssh登录 The authenticity of host 192.168.0.xxx can't be established. 的问题
用ssh登录一个机器(换过ip地址),提示输入yes后,屏幕不断出现y,只有按ctrl + c结束 错误是:The authenticity of host 192.168.0.xxx can't b ...
- Codeforces Round #200 (Div. 1)D. Water Tree dfs序
D. Water Tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/343/problem/ ...
- [React Native] Using the WebView component
We can access web pages in our React Native application using the WebView component. We will connect ...
- [AngularJS] Catching errors with $exceptionHandler
The AngularJS $exceptionHandler service allows you to catch and handle unanticipated JavaScript erro ...
- unity3D Socket连接C#server出现unity3D编辑器再次启动连接 unity3D编辑器马上卡死
unity3D Socket与C#server第一次连接时通讯正常.客服端段关闭后.unity3D编辑器再次启动连接 unity3D编辑器马上卡死 原因是Socket处于异步状态,而异步线程是不受Un ...
- 第一章 JavaScript概述
JavaScript诞生于1995年.它当时的目的是为了验证表单输入的验证.因为在JavaScript 问世之前,表单的验证都是通过服务器端验证.而当时都是电话拨号上网的年代,服务器验证数据是一件非常 ...
- jQuery选择器模糊匹配
<html> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8&quo ...
- visual studio 2013 有效序列号
还没试过,可以参考下! visual studio 2013 有效序列号: BWG7X-J98B3-W34RT-33B3R-JVYW9
- PHP加速器
转http://www.vpser.net/opt/apc-eaccelerator-xcache.html 一.PHP加速器介绍 PHP加速器是一个为了提高PHP执行效率,从而缓存起 ...
- 属性文件Plist
属性文件: Property List File:简称plist 概念iOS开发中常见的一种文件格式.按照固定格式保存数据. 属性文件和XML文件都属性结构化文件.文件的内容按指定的格式保存数据. 作 ...