关于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)方法。
源码地址: