EventBus

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

(今天先写到这里,我这渣子英文水平去翻译这个还是有些吃力啊,不过却是锻炼了英文水平。)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值