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); }
(今天先写到这里,我这渣子英文水平去翻译这个还是有些吃力啊,不过却是锻炼了英文水平。)
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories