Android开发Android开发Android开发经验谈

EventBus 简单使用(一)

2018-12-05  本文已影响14人  d74f37143a31

好用,但是要用好不容易!

EventBus 介绍

官网地址:http://greenrobot.org/eventbus/

使用介绍地址:http://greenrobot.org/eventbus/documentation/

EventBus 使用场景

EventBus是一个AndroidJava的开源库,使用发布者/订阅者模式进行松散耦合。
事件发布订阅 就像是生活中的:你订阅了一家杂志的书刊,每到固定的时间,杂志社就会把书送给你。
Android中对应的就是,我在某个页面需要得到某个数据或者某个对象,那么我在当前页面先订阅,那么在拥有该数据或者对象的操作中发送事件。我就能在对应的已经订阅了该数据或者该对象的页面得到发送的事件。

使用

第一步:添加依赖

compile 'org.greenrobot:eventbus:3.1.1'

第二步:定义Java对象

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

第三步:准备订阅者

Activity或者Fragment中的onResume()onPause()中注册,再定义一个方法用来接受事件。

@Override
public void onResume() {
    super.onResume();
    EventBus.getDefault().register(this);
}
 
@Override
public void onPause() {
    super.onPause();
    EventBus.getDefault().unregister(this);
}

/**
*  下面是两种方式接收事件
*  第一个是:声明了在主线程中接收,可以进行 UI 相关的操作
*  第二个是:没有声明在主线程中接收,刷新 UI 可能会出现问题
*/

// This method will be called when a MessageEvent is posted (in the UI thread for Toast)
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
    Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show();
}
 
// This method will be called when a SomeOtherEvent is posted
@Subscribe
public void handleSomethingElse(SomeOtherEvent event) {
    doSomethingWith(event);

第四步:发送事件

EventBus.getDefault().post(new MessageEvent("Hello everyone!"));

以上就完成了 EventBus 的简单使用~

上面说到了在处理事件时可以指定线程,它有以下四种线程模式:

// Called in the same thread (default)
// ThreadMode is optional here
@Subscribe(threadMode = ThreadMode.POSTING)
public void onMessage(MessageEvent event) {
    log(event.message);
}
// Called in Android UI's main thread
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessage(MessageEvent event) {
    textField.setText(event.message);
}
// Called in Android UI's main thread
@Subscribe(threadMode = ThreadMode.MAIN_ORDERED)
public void onMessage(MessageEvent event) {
    textField.setText(event.message);
}
// Called in the background thread
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onMessage(MessageEvent event){
    saveToDisk(event.message);
}
// Called in a separate thread
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onMessage(MessageEvent event){
    backend.send(event.message);
}
上一篇 下一篇

猜你喜欢

热点阅读