EventBus 3.0 使用详解

集成

compile ‘org.greenrobot:eventbus:3.0.0‘

官方文档:http://greenrobot.org/eventbus/documentation/how-to-get-started/

最简单的例子:

要发送的类:

public class FirstEvent {
    private String mMsg;
    public FirstEvent(String msg) {
        mMsg = msg;
    }
    public String getMsg(){
        return mMsg;
    }
}

在要接收消息的类(任何类 因为参数是Object)注册:在不需要的时候解除注册

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

接收时 :方法名任意 加这个就OK @Subscribe

   @Subscribe(threadMode = ThreadMode.MAIN)
    public void zoneEvent(FirstEvent event) {/* Do something */
        String msg = "onEvent收到了消息:" + event.getMsg();
        Logger.d(msg);
        textView5.setText(event.getMsg());
    }

发送时:

  EventBus.getDefault().post(new FirstEvent("Hello eventBus!"));

EventBus Delivery Threads (ThreadMode)理解:

ThreadMode: POSTING(既不切换事件):该事件在哪个线程发布出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。使用这个方法时,在onEvent方法中不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟。

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

ThreadMode: MAIN(UI线程):不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行,这个在Android中是非常有用的,因为在Android中只能在UI线程中跟新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。

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

ThreadMode: BACKGROUND(非UI线程):如果事件是在UI线程中发布出来的,那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么onEventBackground函数直接在该子线程中执行。

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

ThreadMode: ASYNC(子线程):使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync.

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

sticky 与缓存清除

介绍:

EventBus allows you to post events that are “sticky” and by that EventBus understands events that “stick to the eventbus” for future access.

If you post a normal event when there are no subscribers registered at the moment of sending, this event will be discarded.

You can post a sticky event though, even if there are no subscribers to receive that at the moment, and it won’t be discarded (unless there is another sticky event posted in the future). When a subscriber registers with registerSticky the delivery of the last sticky event is also triggered.

来自:http://stackoverflow.com/questions/28051317/eventbus-register-and-registersticky-method

activity 发送这个 的时候 还没有注册 但是他把此类的最后一个对象存

EventBus.getDefault().postSticky(new FirstEvent("Hello eventBus Sticky!"));

fgment的取出 因为sticky=true所以 他从以前存的地方取出来东西

注意: stick=true 就是现在用post发的东西也可以接受的:

  EventBus.getDefault().register(this);
  @Subscribe(sticky = true)
    public void onEvent(FirstEvent event) {
        // UI updates must run on MainThread
        String msg = "sticky onEvent收到了消息:" + event.getMsg();
        Logger.d(msg);
    }

清除缓存

EventBus.getDefault().clearCaches();

removeAllStickyEvents

removeStickyEvent(Class eventType)

removeStickyEvent(Object event)

参考:

http://blog.csdn.net/harvic880925/article/details/40660137

http://greenrobot.org/eventbus/documentation/how-to-get-started/

时间: 2024-08-11 07:47:35

EventBus 3.0 使用详解的相关文章

C# 网络编程之豆瓣OAuth2.0认证详解和遇到的各种问题及解决

        最近在帮人弄一个豆瓣API应用,在豆瓣的OAuth2.0认证过程中遇到了各种问题,同时自己需要一个个的尝试与解决,最终完成了豆瓣API的访问.作者这里就不再吐槽豆瓣的认证文档了,毕竟人家也不容易.但是作者发现关于豆瓣OAuth认证过程的文章非常之少,所以想详细写这样一篇文章方便后面要做同样东西的人阅读.希望文章对大家有所帮助,尤其是想做豆瓣API开发的初学者. (文章中蓝色字表示官方文档引用,红色字是可能遇到问题及注意,黑色字是作者叙述) 一.误区OAuth1.0认证过程    

Cocos2d-x 3.0坐标系详解(转载)

Cocos2d-x 3.0坐标系详解Cocos2d-x坐标系和OpenGL坐标系相同,都是起源于笛卡尔坐标系.笛卡尔坐标系笛卡尔坐标系中定义右手系原点在左下角,x向右,y向上,z向外,OpenGL坐标系为笛卡尔右手系.屏幕坐标系和Cocos2d坐标系标准屏幕坐标系使用和OpenGL不同的坐标系,而Cocos2d则使用和OpenGL相同的坐标系.iOS, Android, Windows Phone等在开发应用时使用的是标准屏幕坐标系,原点为屏幕左上角,x向右,y向下.Cocos2d坐标系和Ope

CentOS 7上安装Zabbix Server 3.0 图文详解

转载自 http://www.linuxidc.com/Linux/2016-09/135204.htm CentOS 7上安装Zabbix Server 3.0 图文详解 1.查看系统信息. cat /etc/RedHat-releaseCentOS Linux release 7.0.1406 (Core) uname -a Linux VM_96_155_centos3.10.0-123.el7.x86_64 #1 SMP Mon Jun 30 12:09:22 UTC 2014 x86_

Spring3.0 AOP 详解

一.什么是 AOP. AOP(Aspect Orient Programming),也就是面向切面编程.可以这样理解,面向对象编程(OOP)是从静态角度考虑程序结构,面向切面编程(AOP)是从动态角度考虑程序运行过程. 二.AOP 的作用. 常常通过 AOP 来处理一些具有横切性质的系统性服务,如事物管理.安全检查.缓存.对象池管理等,AOP 已经成为一种非常常用的解决方案. 三.AOP 的实现原理. 如图:AOP 实际上是由目标类的代理类实现的.AOP 代理其实是由 AOP 框架动态生成的一个

zabbix专题:第二章 zabbix3.0安装详解

zabbix3.0安装详解 本节目录大纲 安装配置mariadb 安装服务器端 zabbix web配置 web页面初始化 更改为中文 中文乱码问题 zabbix专题:第二章 zabbix3.2安装详解 zabbix专题:第二章 zabbix3.2安装详解 官方文档地址: https://www.zabbix.com/documentation/3.2/manual/installation/install_from_packages 我安装zabbix用的rpm包,可以从官网的源里面去下载,需

Retrofit2.0使用详解

Retrofit2.0使用 随笔 生活是一面镜子,不去擦拭,岁月的灰尘将掩埋它. 转载请标明出处:http://blog.csdn.net/qq_15807167/article/details/51712048 主页 Retrofit20使用 初次了解Retrofit 具体的使用文档 请求体Request Body FORM ENCODED AND MULTIPART 表单和Multipart 异步 VS 同步 Retrofit20的新知识点 Retrofit20的使用方式 使用 注意 如果有

[转载]AxureRP 7.0部件详解(一)

本文为Axure RT7.0教程,本章主要介绍menu菜单.table表格.Tree Widget 树部件三个部件,后续将持续更新...... Menu 菜单 常用案例 网站导航菜单部件通常用于母板之中,其目的是在原型中跳转到不同页面. 编辑菜单要编辑菜单,右键点击在弹出的上下文菜单中选择 在之前/之后新增菜单项.删除菜单.新增子菜单. 菜单样式使用工具栏或部件样式面板可以编辑菜单样式,如填充颜色,字体颜色,字体大小等,需要注意的是子菜单是通过父菜单获取格式的.要自定义菜单样式,参见 弹出菜单案

虚拟机VMware下安装Red Hat Linux 9.0步骤详解

注意:本安装全部是在虚拟机上进行的,用的是ISO镜像文件安装. 1.安装完VMware  Workstation后,启动VMware  Workstation,新建一个虚拟机,其主界面如下图. 2.VMware  Workstation的配置 VMware  Workstation安装完毕后,利用它可以建立多个虚拟机,每新建一个虚拟机,就会要求你建立一个配置文件.这个配置文件实际上相当于新电脑的"硬件配置",你可以在配置文件中决定虚拟机的硬盘如何配置,内存多大,准备运行哪种操作系统,是

memcached java client 3.0.2详解

memcached-java-client-3.0.2详解 一:MemCachedClient的创建 创建该客户端对象的构造方法有以下几个: 1, /** * Creates a new instance of MemCachedClient. */ public MemCachedClient() { this(null, true, false); } 2, /** * Creates a new instance of MemCachedClient accepting a passed