EventBus 3.0 简单使用
2016-08-27 18:42
267 查看
今天周六,可谓是阳光明媚啊,早上一觉睡到九点,昨天晚上喝了一瓶啤酒,睡眠质量就是高啊。今天洗了洗衣服,晒了晒被子,刷了刷鞋,然后跑着去了超市,买了点东西,主要是买的苹果和啤酒。还买了蛤蜊,自从毕业以后就没吃过蛤蜊,晚上炒个蛤蜊喝点啤酒,也是没谁了!进入正题
EventBus 和Otto 作用都是为了简化Android 组件之间的通信,优点是开销小,代码更优雅,以及将发送者和接收者解耦
举个Activity之间通信的例子,下面看代码
1: MainActivity 启动SecondActivity,在SecondActivity中点击一个按钮,发布一个字符串,更新MainActivity 中一个按钮的显示的文字
看效果
比如说,SecondActivity需要发布一个对象,而不是简单的数据类型也很简单。
然后更改MainActivity的处理事件方法,就可以了
2:粘性事件。订阅粘性事件意思就是这个事件发布的时候,你并没有订阅,但是后来你订阅了此类型的事件,这时候你依然会接受到这个发布的事件。就好比NBA球赛直播的时候你没看,但是直播结束后,你可以看看录像。就是这么个意思。
修改MainActivity的代码
看效果
3 :手动移除粘性事件,如果我们想手动移除粘性事件,让这个粘性事件不能再被订阅者接收到。
修改button1的点击事件
最后解释一下 @Subscribe(threadMode = ThreadMode.MAIN) 是什么鬼。
行,今天就总结到这里吧,该做饭吃饭了。
EventBus 3.0 简单使用,绝对不是老司机。
参考网址,EventBus 官网 EventBus 刘望舒csdnEventBus 和Otto 作用都是为了简化Android 组件之间的通信,优点是开销小,代码更优雅,以及将发送者和接收者解耦
举个Activity之间通信的例子,下面看代码
//先自定义一个对象,组件之间通信并不一定非得传递对象,基本数据类型也是可以的 public class MessageEvent { public String message; public MessageEvent(String message) { this.message = message; } public void setMessage(String message) { this.message = message; } public String getMessage() { return message; } }
1: MainActivity 启动SecondActivity,在SecondActivity中点击一个按钮,发布一个字符串,更新MainActivity 中一个按钮的显示的文字
//在MainActivity 的onCreate方法中注册订阅事件 //EventBus.getDefault().register(MainActivity.this); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //在MainActivity 的onCreate方法中注册订阅事件 EventBus.getDefault().register(MainActivity.this); button = (Button) findViewById(R.id.button); //启动 SecondActivity button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { startActivity(new Intent(MainActivity.this, SecondActivity.class)); } });
//在MainActivity处理事件,方法名随便写 @Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(String str) { button.setText(str); }
//在在MainActivity 的onDestroy方法中取消注册订阅事件 @Override protected void onDestroy() { EventBus.getDefault().unregister(this); super.onDestroy(); }
//SecondActivity发布事件 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //使用post方法发布一个字符串 EventBus.getDefault().post("今天周六,可谓是阳光明媚啊!"); finish(); } }); }
看效果
比如说,SecondActivity需要发布一个对象,而不是简单的数据类型也很简单。
EventBus.getDefault().post(new MessageEvent("今天周六,可谓是阳光明媚啊!"));
然后更改MainActivity的处理事件方法,就可以了
@Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(MessageEvent event) { button.setText(event.message); }
2:粘性事件。订阅粘性事件意思就是这个事件发布的时候,你并没有订阅,但是后来你订阅了此类型的事件,这时候你依然会接受到这个发布的事件。就好比NBA球赛直播的时候你没看,但是直播结束后,你可以看看录像。就是这么个意思。
修改MainActivity的代码
//在onCreate的时候不注册,直接跳转,SecondActivity @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button) findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { startActivity(new Intent(MainActivity.this, SecondActivity.class)); } }); button1 = (Button) findViewById(R.id.button1); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //注册事件,这时候处理事件的onMessageEvent依然能接收到事件 EventBus.getDefault().register(MainActivity.this); } }); }
//处理事件方法 sticky = true @Subscribe(threadMode = ThreadMode.POSTING, sticky = true) public void ononMoonStickyEvent(MessageEvent messageEvent) { button1.setText(messageEvent.getMessage()); }
//SecondActivity postSticky方法不再是post方法了 EventBus.getDefault().postSticky(new MessageEvent("今天周六,可谓是阳光明媚啊!"));
看效果
3 :手动移除粘性事件,如果我们想手动移除粘性事件,让这个粘性事件不能再被订阅者接收到。
//在MainActivity中写一个方法 public void remove() { MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class); if (stickyEvent != null) { //打印然后移除粘性事件 Log.e("tag", stickyEvent.getMessage()); EventBus.getDefault().removeStickyEvent(stickyEvent); } }
修改button1的点击事件
remove(); EventBus.getDefault().register(MainActivity.this);
在注册之前,先把粘性事件移除,之后注册,但是处理粘性事件的ononMoonStickyEvent方法并没有执行,因为事件已经收不到了。
最后解释一下 @Subscribe(threadMode = ThreadMode.MAIN) 是什么鬼。
//摘自刘望舒的博客,顶部有链接。 EventBus3.0有以下四种ThreadMode: POSTING(默认):如果使用事件处理函数指定了线程模型为POSTING,那么该事件在哪个线程发布出来的,事件处理函数就会在这个线程中运行,也就是说发布事件和接收事件在同一个线程。在线程模型为POSTING的事件处理函数中尽量避免执行耗时操作,因为它会阻塞事件的传递,甚至有可能会引起ANR。 MAIN: 事件的处理会在UI线程中执行。事件处理时间不能太长,长了会ANR的。 BACKGROUND:如果事件是在UI线程中发布出来的,那么该事件处理函数就会在新的线程中运行,如果事件本来就是子线程中发布出来的,那么该事件处理函数直接在发布事件的线程中执行。在此事件处理函数中禁止进行UI更新操作。 ASYNC:无论事件在哪个线程发布,该事件处理函数都会在新建的子线程中执行,同样,此事件处理函数中禁止进行UI更新操作。
行,今天就总结到这里吧,该做饭吃饭了。
相关文章推荐
- EventBus 3.0+ 简单集成使用
- EventBus 3.0 简单使用
- CKEditor 3.0(FCKEditor3.0)的简单安装配置使用
- 使用iBATIS3.0注解完成对数据库的简单操作
- Cocos2dx 3.0 过渡篇(二十七)C++11多线程std::thread的简单使用(下)
- 使用Cocos2d-x 3.0和物理引擎制作简单的platformer游戏
- Cocos2dx 3.0 过渡篇(二十七)C++11多线程std::thread的简单使用(下)
- cocos2dx 3.0 简单使用 CocoStudio Animation Editor
- CKEditor 3.0(FCKEditor3.0)的简单安装配置使用
- 【入门教程】使用Cocos2D 3.0构建简单的iPhone游戏
- 【入门教程】使用Cocos2D 3.0构建简单的iPhone游戏
- cocos2dx 3.0 简单使用 CocoStudio Animation Editor
- 如何使用Maven 3.0, Flex Mojos 4.0和Flex 4.5构建一个简单的SWF程序
- 使用 ext.js 3.0 和 .net 做的一个简单HR 系统,供大家参考
- Detours 3.0 Express VC6.0编译方法及简单使用
- Cocos2dx 3.0 过渡篇(二十六)C++11多线程std::thread的简单使用(上)
- CKEditor 3.0的简单安装配置使用
- SiteMesh 3.0版本的简单使用
- SiteMesh 3.0版本的简单使用
- cocos2dx 3.0 简单使用 CocoStudio UI Editor