EventBus3.0使用
来源:互联网 发布:java游戏开发视频 编辑:程序博客网 时间:2024/05/16 15:22
EventBus是一个事件发布/订阅总线,有效适用于Android系统平台。
配置
在build.gradle文件中添加EvnetBus依赖
compile 'org.greenrobot:eventbus:3.1.1'
在Activity的onCreate或Fragmnet的onViewCreated中注册EvnetBus
EventBus.getDefault().register(this);
在Activity或Fragmnet的onDestroy中取消注册EvnetBus
EventBus.getDefault().unregister(this);
通过post发送订阅事件
//发送普通事件EventBus.getDefault().post(new SonEvent("China"));
//发送粘性事件EventBus.getDefault().postSticky(new SonEvent("USA"));
提示
粘性事件与一般的事件不同,粘性事件是先发送出去,然后让后面注册的订阅者能够收到该事件。粘性事件的发送是通过postSticky方法进行发送
这里可以在上一个Activity中发送一个粘性事件,在MainActivity中接受
mBtn1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //发送粘性事件 EventBus.getDefault().postSticky(new SonEvent("USA")); } });
EventBus3.0源码解析请戳这里
使用
public class MainActivity extends AppCompatActivity { private Button mBtn1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_activity); //订阅 EventBus.getDefault().register(this); mBtn1 = (Button) findViewById(R.id.btn1); mBtn1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //发送事件 EventBus.getDefault().post(new SonEvent("china")); } }); } @Override protected void onStop() { super.onStop(); //取消注册 EventBus.getDefault().unregister(this); } //不管发送在什么线程-这里只在主线程接受-阻塞式代码执行(订阅方法立即执行) @Subscribe(threadMode = ThreadMode.MAIN) public void sonEventMain(SonEvent evet) { Log.d("message", "SonEvent-MAIN" + "--当前线程:" + Thread.currentThread()); } //发送到主线-因FatherEvent是SonEvent的父类,所以也可以收到 @Subscribe(threadMode = ThreadMode.MAIN) public void fatherEvent(FatherEvent evet) { Log.d("message", "FatherEvent" + "--当前线程:" + Thread.currentThread()); } //发送到主线-因SonEvent实现了PeopleEvent接口,所以也可以收到 @Subscribe(threadMode = ThreadMode.MAIN) public void peopleEvent(PeopleEvent evet) { Log.d("message", "PeopleEvent" + "--当前线程:" + Thread.currentThread()); } //post在什么线程,这里接受就在什么线程 @Subscribe(threadMode = ThreadMode.POSTING) public void sonEventPosting(SonEvent evet) { Log.d("message", "sonEvent-POSTING" + "--当前线程:" + Thread.currentThread()); } //不管发送在什么线程-这里只在主线程接受-非阻塞式(先进队列,订阅方法顺序执行) @Subscribe(threadMode = ThreadMode.MAIN_ORDERED) public void sonEventMainOrdered(SonEvent evet) { Log.d("message", "sonEvent-MAIN_ORDERED" + "--当前线程:" + Thread.currentThread()); } //在后台(非主线程)执行(订阅方法顺序执行) @Subscribe(threadMode = ThreadMode.BACKGROUND) public void sonEventBackground(SonEvent evet) { Log.d("message", "sonEvent-BACKGROUND" + "--当前线程:" + Thread.currentThread()); } //在后台(非主线程)执行(订阅方法并行执行) @Subscribe(threadMode = ThreadMode.ASYNC) public void sonEventAsync(SonEvent evet) { Log.d("message", "sonEvent-ASYNC" + "--当前线程:" + Thread.currentThread()); } //发送粘性事件 @Subscribe(threadMode = ThreadMode.MAIN, sticky = true, priority = 100) public void sonsticky(SonEvent event) { Log.d("message", "sticky-" + "name:" + event.getName() + "--当前线程:" + Thread.currentThread()); }}
打印结果
com.cn.liuyz.javademo D/message: sticky-name:USA--当前线程:Thread[main,5,main]com.cn.liuyz.javademo D/message: sticky-name:China--当前线程:Thread[main,5,main]com.cn.liuyz.javademo D/message: SonEvent-MAIN--当前线程:Thread[main,5,main]com.cn.liuyz.javademo D/message: sonEvent-POSTING--当前线程:Thread[main,5,main]com.cn.liuyz.javademo D/message: PeopleEvent--当前线程:Thread[main,5,main]com.cn.liuyz.javademo D/message: FatherEvent--当前线程:Thread[main,5,main]com.cn.liuyz.javademo D/message: sonEvent-ASYNC--当前线程:Thread[pool-1-thread-1,5,main]com.cn.liuyz.javademo D/message: sonEvent-MAIN_ORDERED--当前线程:Thread[main,5,main]com.cn.liuyz.javademo D/message: sonEvent-BACKGROUND--当前线程:Thread[pool-1-thread-2,5,main]
BACKGROUND和ASYNC区别
BACKGROUND中的任务是一个接着一个去调用,使用executorRunning布尔值进行控制(顺序执行)
Async中的任务会立即获取空闲线程或者直接创建线程去执行(并发执行)
两者都是使用Executors.newCachedThreadPool()创建线程池
总结
- 发布订阅事件时,不管订阅方法是否支持粘性,都可收到订阅事件
- 订阅方法优先级越高越快执行
阅读全文
0 0
- EventBus3.0使用总结
- EventBus3.0使用总结
- EventBus3.0使用详解
- EventBus3.0使用
- EventBus3.0的使用
- EventBus3.0使用
- EventBus3.0使用详解
- EventBus3.0使用详解
- EventBus3.0使用
- EventBus3.0使用详解
- EventBus3.0使用介绍
- EventBus3.0的使用
- EventBus3.0的使用
- EventBus3.0的使用
- EventBus3.0的使用
- EventBus3.0的使用
- EventBus3.0使用详解
- EventBus3.0使用详解
- 织梦DedeCMS二次开发必用之数据库类操作
- 爱的任性
- 爱不是得到,而是付出
- 书单
- 线段树简单入门模板--单点更新
- EventBus3.0使用
- 蓝桥杯 基础练习 闰年判断
- PHP 配置smarty3
- 降维相关
- 自己动手编译NodeMCU固件
- mysql的架构、并发和事务简介
- 生物信息--连锁不平衡(Linkage Disequilibrium)
- javascript之DOM操作CSS
- ActionBar/Toolbar定制ui