EventBus的使用

使用EventBus, 主要目的在于实现App组件间通信的解耦.

git地址:  https://github.com/greenrobot/EventBus

基本使用流程:

1. 编写事件类 

public class AnyTypeEvent {
	
	private String someMsg;
	
	public AnyTypeEvent(String message) {
		this.someMsg = message;
	}

	public String getSomeMsg() {
		return someMsg;
	}

	public void setSomeMsg(String someMsg) {
		this.someMsg = someMsg;
	}
	
}

 2. 注册事件订阅者 

public class EventTestActivity extends Activity {
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.act_event_test);	
		
		EventBus.getDefault().register(this); // 注册当前Activity为订阅者
		// EventBus.getDefault()是一个单例实现的作用域范围为进程的event bus
	}

	@Override
	protected void onDestroy() {		
		EventBus.getDefault().unregister(this); // 注销订阅者
		super.onDestroy();
	}
}

 3. 在订阅者内部实现订阅函数
     订阅函数的名称固定为4种, 不可变. 这是因为EventBus是同通过反射函数名在订阅类中查找订阅函数. 

     注意: 不要使用register(Object subscriber, String methodName, ...)注册自定义名称的订阅函数, 在2.2版本中已经被Deprecated了.
     订阅函数分为 onEvent, onEventMainThread, onEventBackground, onEventAsync.

     订阅函数必须是public, 且形参个数必须只能是1个.(源代码中写死了...)
     4种订阅函数之间存在差别.

...

// Activity中关于AnyTypeEvent的订阅函数实现
	public void onEvent(AnyTypeEvent event){
		Toast.makeText(this, event.getSomeMsg(), Toast.LENGTH_SHORT).show();
	}

...

 4. 发布事件

btnOnEvent = (Button) findViewById(R.id.btn_act_main_on_event);
		btnOnEvent.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View arg0) {
				// 发布AnyTypeEvent类型的事件
				EventBus.getDefault().post(new AnyTypeEvent("Button-onEvent is clicked."));
			}
		});

5 四种订阅函数之间的区别.

    它们之间的区别在于与post()函数相比较, 是在哪个线程运行订阅函数.

    1) onEvent:   

        在哪个线程调用post(), 就在相同的线程执行onEvent().

    2) onEventMainThread:

        无论post()运行于哪个线程, 都在UI线程执行onEventMainThread().

    3) onEventBackground:

        如果post()运行在子线程, 则onEventBackground()也运行于子线程.

        如果post()运行在UI线程, 则启动子线程运行onEventBackground()

    4) onEventAsync:

        无论post()运行于哪个线程, 都启动子线程执行onEventAsync()

    针对性的选择使用订阅函数,可以避免在线程切换时引发的消耗.

    在使用onEvent, onEventMainThread, onEventBackground时, 务必保证在函数内不要去执行耗时操作, 避免其阻塞了UI线程.

相关推荐