您的位置:首页 > 其它

EventBus的使用及接收消息的四种模式介绍

2017-07-24 22:38 309 查看
使用EventBus很久了,一直都没有写一篇与EventBus有关的博客,自己平时用但很多时候还经常忘记一些细节,所以今天写篇博客方便自己记忆一下,大神勿喷! 看这内容,您最好有个现成的EventBus的使用项目,不然看也没有眉目。

一、EventBus的使用

1.在需要接受消息的类里面,对EventBus进行注册。

EventBus.getDefault().register(this);

2.为了防止内存泄漏和遗忘,在该类的OnDestory()方法里面对EventBus进行解注册。

@Override

protected void onDestroy() {

super.onDestroy();

//结尾要进行解注册

EventBus.getDefault().unregister(this);

}

3.创建发送消息类

创建用到的一个类,里面声明属性,并创建够着方法和get\set方法。

public class FirstEvent {

private String mMsg;

/*
创建该类的构造器
*/
public FirstEvent(String mMsg) {
this.mMsg = mMsg;
}

public String getmMsg() {
return mMsg;
}


}

4.在发送消息类里面发送消息

btn_second.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
EventBus.getDefault().post(new FirstEvent("我发送了一段消息"));
}
});


5.注册监听,接受消息并显示

public void onEventMainThread(FirstEvent event){

String msg = "onEventMainThread收到了消息"+event.getmMsg();

tv_text.setText(msg);
Toast.makeText(MainActivity.this, "mag"+msg, Toast.LENGTH_SHORT).show();

}


二、EventBus的四种模式

在EventBus3.0里面,采用@Subscribe(threadMode =ThreadMode.MAIN) 这样的方式来进行订阅。

1.ThreadMode.MAIN 表示这个方法在主线程执行

首先去判断当前如果是UI线程,则直接调用;否则: mainThreadPoster.enqueue(subscription, event);把当前的方法加入到队列,然后直接通过handler去发送一个消息,在handler的handleMessage中,去执行我们的方法。说白了就是通过Handler去发送消息,然后执行的。

2.ThreadMode.BACKGROUND 表示这个方法在后台执行,不能并发处理。

如果当前非UI线程,则直接调用;如果是UI线程,则将任务加入到后台的一个队列,最终由Eventbus中的一个线程池去调用

executorService = Executors.newCachedThreadPool();。

3.ThreadMode.ASYNC 表示这个方法在后台执行,并且可以异步处理。

将任务加入到后台的一个队列,最终由Eventbus中的一个线程池去调用;线程池与BackgroundThread用的是同一个。

这么说BackgroundThread和Async有什么区别呢?

BackgroundThread中的任务,一个接着一个去调用,中间使用了一个布尔型变量handlerActive进行的控制。

Async则会动态控制并发。

4.ThreadMode.POSYING 表示该方法和消息发送方在同一个线程中执行

参考资料:

http://blog.csdn.net/lmj623565791/article/details/40920453
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息