• 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 ,据不仅仅用于预加载,可以用于任何时候的数据传递,剩下一大批判断是否完成的操作。

  • 相关阅读:
    habse与Hadoop兼容性问题
    java读取TXT文件(硬核区分编码格式)
    ffmpeg相关用法
    java服务器间http通讯,同时传输文件流和数据,并接收返回的文件流或数据
    js 获取正整数各个位上的数字
    解决Input输入中文重复出现拼音
    为什么 io 包一般以 byte 数组做为处理单位?
    Vue3 + Ts 封装axios
    Vue3 ant design 使用Moment.js日期格式化的实现
    Vue3 NProgress进度条
  • 原文地址:https://www.cnblogs.com/Isaber-blogs/p/5476942.html
Copyright © 2020-2023  润新知