仿EventBus自己写的android事件传递者EventMailer

关于EventBus的原理,推荐博客:

http://blog.csdn.net/lmj623565791/article/details/40920453

其实 ,自己在许多时候,总会嫌引入的第三库太重,引入太多的第三方库,对项目来说也是一种负担。于是,有了一种自己实现的想法,这里做一个记录,也想让大家看看,帮忙找找问题,自己也是在摸索着写,


这篇只是原理介绍,还有更新日志,使用方法,下面链接:


http://blog.csdn.net/carlos1992/article/details/50866576

结构:



如图所示,一共四个类:
EventMail:要发送的事件,所有发送的数据,都必须是一个EventMail对象
EventMailer:事件传递者,发送一个EventMail的方法如下

EventMailer.getInstance().sendMail(evnetMail2);

EventMailerException:异常类
IEventReceiver:一个接收EventMail的接口,要想接收到EventMail,必须继承这个接口。

实现思路:

把所有的事件抽象成一封邮件,想要发送事件,就把数据,还有要发给谁,封装成一个EventMail,然后,直接交给EventMailer就可以了,EventMailer就相当于邮差,来传递邮件。当然,如果想接收EventMail,当然要开一个自己的邮箱,邮差才好把信投到你的邮箱里。想要开一个邮箱,就实现IEventReceiver接口就可以了。

整个过程就是这样。

使用方法:

第一步:
在应用打开的时候,一般在Application里初使化EventMailer,如下:
EventMailer.init();
主要用于初使化,如果不初使化,Eventmailer不会去占资源。

第二步:
初使化以后,就可以直接发送邮件了,很简单,自己构造一个EventMail对象,然后就可以发送。

                EventMail evnetMail2 = new EventMail();
                evnetMail2.setAddress_className(FragmentSecond.class.getName());
                evnetMail2.putData(FragmentSecond.class.getName(), "这个是从UI线程发送");
                EventMailer.getInstance().sendMail(evnetMail2);

上面是把这个事件发送给了FragmentSecond这个界面。

接下来看看接收方,接收方需要做三件事:

第一,在onCreate方法中调用这个:

EventMailer.getInstance().register(this);

第二:

在onDestory方法中调用:

EventMailer.getInstance().unregisterReceiver(this);

第三:继承IEventReceiver接口


这三样虽然麻烦,但其实 ,可以在父类里完成这些操作,抽象一下就可以了。

FragmentSecond继承了IEventReceiver接口后,会有一个方法:


    @Override
    public void MailBox(EventMail mail) {
        textView.setText(((String) mail.getData(FragmentSecond.class.getName())));
    }

FragmentSecond可以在这里收到EventMail。


特点:


1.可以跨进程调用,其它线程可以直接发送EventMail到UI线程。不必再使用Handler,代码更整洁。
2.完全是调用的时候才触发,注册的时候,其实,EventMailer直接持有了对象的弱引用,可以直接调用,也不造成内存泄露,EventBus使用了反射。
3.直接指定发送给哪个,EventBus是反射,根据方法参数来发送,自己使用的感觉,这个好一点。


还会再更新,增加一些功能。希望大家多给意见。

更新一:

增加了信息内存存储功能,就是要给某个界面发送EventMail的时候,如果这个界面还没有打开,那就暂时存储这个信息,等这个界面创建的时候,可以主动去拉取EventMail。

使用方法:

首先是初使化方法的改变:

EventMailer.init(true);

这个在应用程序开始的时候初始化,传递一个boolean值,意思是,在界面没有打开的情况下,是否暂时hold住EventMail,当然也可以传false。如果值为false,那传EventMail给某个界面的时候,这个界面不存在,信息就会被丢弃。

然后是主动拉取:

主动拉取方法一:

 List<EventMail> eventMails = EventMailer.getInstance().getMyEventMail(SecondActivity.class.getName());
这个方法,就像让邮差把你的邮件一下子全部给你送过来。可以主动把消息拉过来,返回一个list,如果没有EventMail的话,返回的是null,之所以这样返回为null,而不是一个空的list,是感觉,返回为null的话,更省资源,要不然,每次都要新建一个空的list,也会占用资源。

主动拉取方法二:

EventMailer.getInstance().pushMyEventMail(SecondActivity.class.getName());

这个方法,就像给邮差打了一个招呼,说我在家了,你下次送邮件的时候,把滞留的邮件也一起带来吧。它没有返回值,而是按流程,把EventMail放到了MailBox里面。它会回调MailBox(EvnetMail mail)方法。


源码地址:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值