EventBus 最新上手指南

简介

EventBus 是一款针对 Android 优化的发布/订阅事件总线。主要功能是替代 Intent,Handler,BroadCast在 Fragment,Activity,Service,线程之间传递消息。优点是开销小,代码更优雅。以及将发送者和接收者解耦。

EventBus 官网

EventBus GitHub

使用

  • 第一步:定义 events 对象
public class MessageEvent { ... }
  • 第二步:订阅 events 事件

在Activity和Fragment等的生命周期内,注册/注销订阅事件。例如:

@Override
public void onStart() {
     super.onStart();
     EventBus.getDefault().register(this);
}

@Override
public void onStop() {
     super.onStop();
     EventBus.getDefault().unregister(this);
}

处理订阅事件

@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {/* Do something */};
  • 第三步:发布 evnets 事件
EventBus.getDefault().post(new MessageEvent());

简简单单的三步就完成事件的发送和接收,它可以在不同的Activity之间发送和接收数据,非常方便。如果我们 post 不同的事件对象就要实现相应的订阅事件函数。即我 post(B) 就要实现 onMessageEvent(B) 方法。

ThreadMode 的几种方法

ThreadMode 总共提供了 5 中模式,分别是 POSTING、MAIN、MAIN_ORDERED、BACKGROUND、ASYNC。其分别代表的意义如下:

Mode 意义
POSTING 订阅和发送的事件在同一个线程中处理
MAIN 不管事件在什么线程中发布,订阅的事件都在主线程中处理
MAIN_ORDERED 不管事件在什么线程中发布,订阅的事件都在主线程中依次处理
BACKGROUND 如果发布的事件是在子线程中,订阅的事件就在同一子线程中处理。如果发布的事件是在主线程中,订阅的事件就在EventBus创建的子线程中处理
ASYNC EventBus创建一个独立的线程来处理订阅的事件

依赖

在项目中添加对 EventBus 的依赖。

Gradle:

implementation 'org.greenrobot:eventbus:3.1.1'

Maven:

<dependency>
    <groupId>org.greenrobot</groupId>
    <artifactId>eventbus</artifactId>
    <version>3.1.1</version>
</dependency>

jar

eventbus-3.1.1.jar

测试

前面基本上把 EventBus 需要用到的东西都介绍完了。下面我们就开始动手测试 EventBus 的功能吧。

SecondActivity.java

import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;

public class SecondActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		findViewById(R.id.id_btn).setOnClickListener(new OnClickListener() {
        	
            @Override
			public void onClick(View v) {
				
				new Thread(new Runnable() {
					
					@Override
					public void run() {
						MessageEvent event = new MessageEvent();
						event.message = "Hello";
						EventBus.getDefault().post(event);
                        
                        MessageEventA eventA = new MessageEventA();
						eventA.message = "Hello";
						EventBus.getDefault().post(eventA);
						
						MessageEventB eventB = new MessageEventB();
						eventB.message = "Hello";
						EventBus.getDefault().post(eventB);
                        
                        MessageEventC eventC = new MessageEventC();
						eventC.message = "Hello";
						EventBus.getDefault().post(eventC);
						
						MessageEventD eventD = new MessageEventD();
						eventD.message = "Hello";
						EventBus.getDefault().post(eventD);
						Log.d("TAG", "post:"+Thread.currentThread().getName());
					}
            	}).start();
			}
		});
	}
	
	@Override
	protected void onStart() {
		super.onStart();
		Log.d("TAG", "onStart");
		EventBus.getDefault().register(this);
	}
    
    @Override
	protected void onStop() {
		super.onStop();
		Log.d("TAG", "onStop");
		EventBus.getDefault().unregister(this);
	}
	
	@Subscribe(threadMode = ThreadMode.MAIN)  
	public void onMessageEvent(MessageEvent event) {
		Log.d("TAG", "SecondActivity onMessageEvent MAIN:"+event.message+",thread:"+Thread.currentThread().getName());
	}
    
    @Subscribe(threadMode = ThreadMode.POSTING)  
	public void onMessageEvent(MessageEventA event) {
		Log.d("TAG", "SecondActivity onMessageEvent POSTING: "+event.message+",thread:"+Thread.currentThread().getName());
	}
	
	@Subscribe(threadMode = ThreadMode.MAIN_ORDERED)  
	public void onMessageEvent(MessageEventB event) {
		Log.d("TAG", "SecondActivity onMessageEvent MAIN_ORDERED:"+event.message+",thread:"+Thread.currentThread().getName());
	}
    
    @Subscribe(threadMode = ThreadMode.BACKGROUND)  
	public void onMessageEvent(MessageEventC event) {
		Log.d("TAG", "SecondActivity onMessageEvent BACKGROUND:"+event.message+",thread:"+Thread.currentThread().getName());
	}
	
	@Subscribe(threadMode = ThreadMode.ASYNC)  
	public void onMessageEvent(MessageEventD event) {
		Log.d("TAG", "SecondActivity onMessageEvent ASYNC:"+event.message+",thread:"+Thread.currentThread().getName());
	}
    
    public class MessageEvent {
		public String message;
	}
    
    public class MessageEventA {
		public String message;
	}
    
    public class MessageEventB {
		public String message;
	}
    
    public class MessageEventC {
		public String message;
	}
    
    public class MessageEventD {
		public String message;
	}

布局文件就不贴了,就一个按钮。同时,记得加上对 EventBus 的依赖。

测试代码写完了,运行后,结果如下:

EventBus 最新上手指南_第1张图片

该测试代码基本上把相关的方法都测试了一下,不同的对象事件发送接收,不同的 ThreadMode 的处理线程等。这里只测试了同一个Activity之间的发布订阅,在不同的 Activity 之间订阅相同的事件也是一样的,这里就不上过多代码了。EventBus 上手还是非常简单的。在项目中引用 EventBus 可以简化不同 Activity、Fragment 之间的数据传递,方便你我他。

你可能感兴趣的:(android之路)