版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/HandsomeFuHS/article/details/72125864
开宗明义,这篇文章主要是介绍EventBus的使用与原理。循序渐进,第一篇讲使用,第二篇讲原理。
简介
- 首先,要知道Eventbus是什么?
官网的定义是:EventBus is a publish/subscribe event bus optimized for Android.
翻译过来就是:EventBus是一个为Android设计的,并且经过优化的发布/订阅事件总线。
这么说不好理解,用白话说就是:Android组件间进行通信的工具、载体。比如Activity之间的通信,可以用原生的startActivityForResult,setResult方法,不过有些麻烦,如果用EventBus实现起来,就简单的多了。 - 下面说一说EventBus的优点吧:
- 简化组件间的通信,将程序员从冗杂的代码中解救就出来。
- 时代码代码更简洁,逻辑更清晰;
- 体积小(约50k),效率高;
- 多线程间通信;
- 易于学习。
EventBus真的很好用,下面就给大家演示一下如何使用。
使用
- 在module级别的build.gradle文件中添加依赖:
compile 'org.greenrobot:eventbus:3.0.0'
定义一个事件(Event),用于在组件间传递信息:
class MainEvent { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
订阅事件(接收事件):
首先在订阅事件的Activity或Fragment中注册和解除注册EventBus:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); EventBus.getDefault().register(this); } @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); }
订阅事件
@Subscribe public void handleEvent(MainEvent e) { tvName.setText(e.getName()); tvAge.setText(e.getAge() + ""); }
发送事件:
MainEvent e = new MainEvent(); e.setName(etName.getText().toString()); e.setAge(Integer.parseInt(etAge.getText().toString())); EventBus.getDefault().post(e); finish();
这样,在发送完事件之后,就会执行handleEvent方法了。是不是很简单?Eventbus的用法基本就是这样,下面说一下EventBus的线程模式。
线程模式
POSTING:处理事件的线程与发送事件的线程相同。就是说,在哪个线程发送事件,就在那个线程处理事件。这也是默认的线程模式。
// Called in the same thread (default) // ThreadMode is optional here @Subscribe(threadMode = ThreadMode.POSTING) public void onMessage(MessageEvent event) { log(event.message); }
MAIN: 无论在哪个线程发送事件,都在主线程处理事件,比如更新UI。
// Called in Android UI's main thread @Subscribe(threadMode = ThreadMode.MAIN) public void onMessage(MessageEvent event) { textField.setText(event.message); }
- BACKGROUND:如果发送事件的线程是主线程,那么EventBus会新创建一个Background线程,来处理事件。如果发送事件的线程不是主线程,那么就在发送线程处理事件。比如执行耗时操作:网络请求,防止阻塞主线程。
// Called in the background thread
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onMessage(MessageEvent event){
saveToDisk(event.message);
}
ASYNC:无论在哪个线程发送事件,都新创建一个线程(其实EventBus会维护一个ThreadPool,每次返回一个Thread)来处理事件。比如执行耗时操作:网络请求,防止阻塞主线程。
// Called in a separate thread @Subscribe(threadMode = ThreadMode.ASYNC) public void onMessage(MessageEvent event){ backend.send(event.message); }
好的,基本用法就是这些,谢谢大家哦~~