您的位置:首页 > 移动开发 > Android开发

EventBus

2016-07-10 13:57 459 查看

EventBus 学习记录

一、概述

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

二、使用方法

0x01 添加引用

​ Gradle:

compile 'org.greenrobot:eventbus:3.0.0'


​ Maven:

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


0x02 基本使用

(1) Define events:

​  主要是一个消息类,存储需要传递的消息,根据消息的内容可进行自定义。

public class MessageEvent {
public final int Code;
public final String message;
public MessageEvent(int code,String message){
this.Code = code;
this.message = message;
}
}


(2) Prepare Subscribers

​ 准备消息接受者的方法。当一个消息传递来的时候,消息接收者的方法就会被调用。

​ 在3.0版本中可以直接使用注解来定义消息接收者的方法,而不必去写固定的消息接受的方法名。

@Subscribe

// 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);
}


​ 消息接收者被调用的前提是在Bus中进行了注册。因此,在Activity或者Fragment里要对Bus进行注册。

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

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


(3)Post Events

​ 在任意的代码块中进行消息的发送。所有这册了这个消息类型的接收者都会接收到这个消息。

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


0x03 线程模式(ThreadMode)

官方文档

​ EventBus 可以帮我们处理线程:事件会从一个线程发送到另一个线程中。一个通用的方法是处理主线程的改变。在Android中,UI的改变在主线程中进行处理。另一方面,网络请求,活着其它耗时的任务,不能在主线程中进行。EventBus帮助我们处理这些任务并且同步到主线程中(就不必使用AsyncTask这些了)。

​ 在EventBus中,我们可以指定以下四种线程模型(ThreadMode)中的一个用来调用事件方法。(感觉这句理解的不太对啊,原文是下面的这句)

In EventBus, you may define the thread that will call the event handling method by using one of the four ThreadModes.


(英文水平有限,自己看英文,然后大致把意思翻译了一下。)

ThreadMode:POSTING

​ 这个订阅者(方法)和post在同一个线程中。

@Subscribe(threadMode = ThreadMode.POSTING) // ThreadMode is optional here
public void onMessage(MessageEvent event) {
log(event.message);
}


ThreadMode:MAIN

​ 订阅者将在Android的主线程(ui线程)中被调用。

// Called in Android UI's main thread
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessage(MessageEvent event) {
textField.setText(event.message);
}




ThreadMode:BACKGROUND

​ 订阅者将在后台线程中被调用。

// Called in the background thread
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onMessage(MessageEvent event){
saveToDisk(event.message);
}


ThreadMode:ASYNC

订阅者将会在一个独立的线程中被调用,这个线程独立于主线程和发送时的线程。这个模型主要是用来处理一些耗时的操作,比如网络请求等。EventBus使用一个线程池来高效的复用线程,复用线程来自于异步的事件通知。

// Called in a separate thread
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onMessage(MessageEvent event){
backend.send(event.message);
}


(今天先写到这里,我这渣子英文水平去翻译这个还是有些吃力啊,不过却是锻炼了英文水平。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android eventbus