码迷,mamicode.com
首页 > 其他好文 > 详细

30分钟学会EventBus3.0详解(二)(EventBus3.0的使用)(by星空武哥)

时间:2016-08-03 12:04:48      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:

转载声明原创地址:http://blog.csdn.net/lsyz0021/article/details/52094855

30分钟学会EventBus3.0详解(一)(引入和初始化EventBus3.0)



30分钟学会EventBus3.0详解(二)(EventBus3.0的使用)

       写完上篇文章,这篇这心不想写了,但是每周至少一篇的习惯不能改啊!虽然EventBus使用起来很简单,但是种类特别多,比如他有粘性事件和非粘性事件,他们又都含有四种模式,并且还要测试在ui线程和非ui线程,所以情况很多种,废话不多说继续看。

1、EventBus工具类,这里为了使用方便写了一个简单的工具类,以下文章都是用这个工具类。

<span style="font-size:14px;">public class EventBusUtils {

	private EventBusUtils() {
	}

	/**
	 * 注册EventBus
	 */
	public static void register(Object subscriber) {
		if (!EventBus.getDefault().isRegistered(subscriber))
			EventBus.getDefault().register(subscriber);
	}

	/**
	 * 取消注册EventBus
	 */
	public static void unregister(Object subscriber) {
		EventBus.getDefault().unregister(subscriber);
	}

	/**
	 * 发布订阅事件
	 */
	public static void post(Object subscriber) {
		EventBus.getDefault().post(subscriber);
	}

	/**
	 * 发布粘性订阅事件
	 */
	public static void postSticky(Object subscriber) {
		EventBus.getDefault().postSticky(subscriber);
	}

	/**
	 * 移除指定的粘性订阅事件
	 * @param eventType class的字节码,例如:String.class
	 */
	public static <T> void removeStickyEvent(Class<T> eventType) {
		T stickyEvent = EventBus.getDefault().getStickyEvent(eventType);
		if (stickyEvent != null) {
			EventBus.getDefault().removeStickyEvent((T) stickyEvent);
		}
	}

	/**
	 * 移除所有的粘性订阅事件
	 */
	public static void removeAllStickyEvents() {
		EventBus.getDefault().removeAllStickyEvents();
	}

}</span>

2、创建订阅事件

<span style="font-size:14px;">public class MessageEvent {
	public final String message;

	public MessageEvent(String message) {
		this.message = message;
	}

}</span>

3、创建订阅者模式和类型

 3.1、订阅者模式分为四类:

<span style="font-size:14px;">ThreadMode.MAIN          不管从哪个线程发出的事件,MAIN模式都会在UI(主线程)线程执行
ThreadMode.POSTING       事件从哪个线程发布出来的就会在该线程中运行
ThreadMode.BACKGROUND    如果发送事件的线程是UI线程,则重新创建新的子线程执行,因此不能执行更新UI的操作
ThreadMode.ASYNC         不管从哪个线程发出的事件,ASYNC模式都会创建一个新的子线程来执行</span>

3.2、订阅者的类型分为粘性事件和非粘性事件

 默认就是非粘性事件,如果是粘性事件,只需要在事件的注解上面加上

sticky = true

3.3、粘性事件,在注解上加上 priority = 优先级数(int值)
priority = 1

3.4、下面就这几种模式分别讲解

3.4.1、首先是EventBus的注册,在activity的onStart()中注册

<span style="font-size:14px;">	@Override
	protected void onStart() {
		super.onStart();
		EventBusUtils.register(this);
	}
</span>

  EventBus取消注册,在activity的onDestroy()中取消注册

<span style="font-size:14px;">	@Override
	protected void onDestroy() {
		super.onDestroy();
		EventBusUtils.unregister(this);
	}</span>

3.4.2、发送事件

<span style="font-size:14px;">EventBusUtils.post(new MessageEvent("SecondActivity发布MessageEvent消息了"));</span>

3.4.3、注册事件(含有优先级)

mian模式

<span style="font-size:14px;">	@Subscribe(threadMode = ThreadMode.MAIN, priority = 1)
	public void onMessageEventMain(MyEvent.Message event) {
		text2.setText(event.msg);
		Log.v(tag, event.msg + " MAIN id = " + Thread.currentThread().getId());
	}</span>

POSTING模式

<span style="font-size:14px;">	@Subscribe(threadMode = ThreadMode.POSTING, priority = 2)
	public void onMessageEventPost(MyEvent.Message event) {
		if (isMainThread()) {
			text2.setText(event.msg);
			Log.v(tag, event.msg + " POSTING id = " + Thread.currentThread().getId());
		} else {
			Log.v(tag, event.msg + " POSTING id = " + Thread.currentThread().getId());
		}
	}</span>

BACKGROUND模式
<span style="font-size:14px;">	@Subscribe(threadMode = ThreadMode.BACKGROUND, priority = 3)
	public void onMessageEventBackground(MyEvent.Message event) {
		if (Looper.myLooper() == Looper.getMainLooper()) {

			text2.setText(event.msg);
			Log.v(tag, event.msg + " BACKGROUND id = " + Thread.currentThread().getId());
		} else {

			Log.v(tag, event.msg + " BACKGROUND id = " + Thread.currentThread().getId());
		}
	}</span>
ASYNC模式
<span style="font-size:14px;">	@Subscribe(threadMode = ThreadMode.ASYNC, priority = 4)
	public void onMessageEventAsync(MyEvent.Message event) {
//		text2.setText(event.msg);	// 不能在这里执行更新ui的操作
		LogUtils.v(tag, event.msg + " Async id = " + Thread.currentThread().getId());

	}</span>

如果为粘性事件则:

发送粘性事件

<span style="font-size:14px;">EventBusUtils.postSticky(new MessageEvent("SecondActivity发布MessageEvent消息了"));</span>

订阅粘性消息
<span style="font-size:14px;">	@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
	public void MessageEvent(MessageEvent event) {
		tv_text1.setText(event.message);
	}</span>

更详细请看代码:https://github.com/lsyz0021/EventBusUtils


30分钟学会EventBus3.0详解(二)(EventBus3.0的使用)(by星空武哥)

标签:

原文地址:http://blog.csdn.net/lsyz0021/article/details/52094855

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!