Android EventBus简单介绍(一)
2016-09-02 16:33
337 查看
EventBus是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现。
作为一个消息总线,有三个主要的元素:
Event:事件(可以是任意对象,参考其他博客中都写成xxxEvent,不过我测试了一个任意名字的对象也可以,不知道如果应用中这么写会不会不规范?)
Subscriber:事件订阅者,接收特定的事件(这里常用的是当前的Activity或者Fragment的上下文)
Publisher:事件发布者,用于通知Subscriber有事件发生
简单使用:
1、定义事件类型:public class MyEvent {}`(就上面任意名称的那个对象,也是我们以后事件处理函数中唯一的传参对象)
2、注册订阅者:EventBus.getDefault().register(this)(this代表订阅者Subscriber,以后还会出现很多和这个单词很像的对象)
3、定义事件处理方法:public void onEventMainThread(这个起名以前是有讲究的,也非常古板,差不多等同四书五经了,现在好了很多,改革开放)
4、发送事件:EventBus.getDefault().post(new MyEvent())(执行之前定义的事件处理方法的语句)
如果不看吐槽语,第一遍看这四个使用步骤,我是懵逼的,完全体会不到简单,所以,先放弃这个笼统的概念和“”晦涩“”的源码,先跑个简单的demo试试~
实现的内容是这样的,创建两个Activity,一个A一个B,然后我们通过A跳转到B,然后让B发送一个信息给A,简单来说就是Activity之间的信息传递,如果按照以前,可能会写个广播,可能会使用intent传参,不过EventBus可以让生活变得简单起来~(~ ̄▽ ̄)~
示意图:
第一个界面
跳转第二个界面
第一个界面响应
UI修改
首先创建一个需要传递的自定的FirstEvent,当然你可以叫别的。
FirstEvent.java
然后是响应的Activity,也是订阅者MainActivity.java
我们需要在MainActivity把自己注册成订阅者,并且完成SecondActivity会调用的事件处理函数,不然SecondActivity调他干什么~
MainActivity.java
可以注意到,上面的代码中,除了常规的处理以为,我们使用EventBus.getDefault().register(this)注册了当前对象为订阅者,然后相对应的,要在onDestory中解除注册,毕竟EventBus是单例模型,要避免内存泄漏啊。
最后实现了一个叫onEventMainThread的方法,传入我们之前自定义的event,做了一些ui上的处理,这里的处理是设置一个TextView的内容。
这里的函数名起名以前是有讲究的,必须以onEvent开头,后面的界面也是固定的,代表着处理缩在的线程,一共有四种类型,这里的类型代表UI线程。现在可以随意。还有就是函数上面的@SubScribe标签,必须要写,否则程序就跪了。(3.0.0jar包运行结果)。
那么SecondActivity.java是如何发布事件的呢?
SecondActivity.java
SecondActivity通过EventBus.getDefault().post(new FirstEvent("FirstEvent btn clicked"))来发布一个事件,从而才能调用MainActivity的处理函数。
整个过程非常的清楚明了,而且没有什么代码冗余,很值得学习一下有木有~(o゜▽゜)o☆[BINGO!]
那么更加详细的流程是怎么样的,这就需要看看源码了,哎╮(╯▽╰)╭
作为一个消息总线,有三个主要的元素:
Event:事件(可以是任意对象,参考其他博客中都写成xxxEvent,不过我测试了一个任意名字的对象也可以,不知道如果应用中这么写会不会不规范?)
Subscriber:事件订阅者,接收特定的事件(这里常用的是当前的Activity或者Fragment的上下文)
Publisher:事件发布者,用于通知Subscriber有事件发生
简单使用:
1、定义事件类型:public class MyEvent {}`(就上面任意名称的那个对象,也是我们以后事件处理函数中唯一的传参对象)
2、注册订阅者:EventBus.getDefault().register(this)(this代表订阅者Subscriber,以后还会出现很多和这个单词很像的对象)
3、定义事件处理方法:public void onEventMainThread(这个起名以前是有讲究的,也非常古板,差不多等同四书五经了,现在好了很多,改革开放)
4、发送事件:EventBus.getDefault().post(new MyEvent())(执行之前定义的事件处理方法的语句)
如果不看吐槽语,第一遍看这四个使用步骤,我是懵逼的,完全体会不到简单,所以,先放弃这个笼统的概念和“”晦涩“”的源码,先跑个简单的demo试试~
实现的内容是这样的,创建两个Activity,一个A一个B,然后我们通过A跳转到B,然后让B发送一个信息给A,简单来说就是Activity之间的信息传递,如果按照以前,可能会写个广播,可能会使用intent传参,不过EventBus可以让生活变得简单起来~(~ ̄▽ ̄)~
示意图:
第一个界面
跳转第二个界面
第一个界面响应
UI修改
首先创建一个需要传递的自定的FirstEvent,当然你可以叫别的。
FirstEvent.java
public class FirstEvent { private String msg; public FirstEvent(String msg) { this.msg = msg; } public String getMsg() { return msg; } }
然后是响应的Activity,也是订阅者MainActivity.java
我们需要在MainActivity把自己注册成订阅者,并且完成SecondActivity会调用的事件处理函数,不然SecondActivity调他干什么~
MainActivity.java
public class MainActivity extends Activity { Button btn; TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); EventBus.getDefault().register(this); btn = (Button) findViewById(R.id.btn_try); tv = (TextView) findViewById(R.id.tv); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(getApplicationContext(), SecondActivity.class); startActivity(intent); } }); } @Subscribe(threadMode = ThreadMode.Main) public void onEventMainThread(FirstEvent event) { String msg = "onEventMainThread收到了消息:" + event.getMsg(); Log.d("harvic", msg); tv.setText(msg); Toast.makeText(this, msg, Toast.LENGTH_LONG).show(); } @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); } }
可以注意到,上面的代码中,除了常规的处理以为,我们使用EventBus.getDefault().register(this)注册了当前对象为订阅者,然后相对应的,要在onDestory中解除注册,毕竟EventBus是单例模型,要避免内存泄漏啊。
最后实现了一个叫onEventMainThread的方法,传入我们之前自定义的event,做了一些ui上的处理,这里的处理是设置一个TextView的内容。
这里的函数名起名以前是有讲究的,必须以onEvent开头,后面的界面也是固定的,代表着处理缩在的线程,一共有四种类型,这里的类型代表UI线程。现在可以随意。还有就是函数上面的@SubScribe标签,必须要写,否则程序就跪了。(3.0.0jar包运行结果)。
那么SecondActivity.java是如何发布事件的呢?
SecondActivity.java
public class SecondActivity extends Activity { private Button btn_FirstEvent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); btn_FirstEvent = (Button) findViewById(R.id.btn_first_event); btn_FirstEvent.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { EventBus.getDefault().post( new FirstEvent("FirstEvent btn clicked")); } }); } }
SecondActivity通过EventBus.getDefault().post(new FirstEvent("FirstEvent btn clicked"))来发布一个事件,从而才能调用MainActivity的处理函数。
整个过程非常的清楚明了,而且没有什么代码冗余,很值得学习一下有木有~(o゜▽゜)o☆[BINGO!]
那么更加详细的流程是怎么样的,这就需要看看源码了,哎╮(╯▽╰)╭
相关文章推荐
- Android EventBus简单介绍(二)
- (原创)简单介绍Android的EventBus(中)
- Android 之 EventBus(一)简单介绍
- (原创)简单介绍Android的EventBus(上)
- (原创)简单介绍Android的EventBus(下)
- Android感应检测Sensor(简单介绍)
- android 动画简单介绍
- android里的service和content provider简单介绍
- Android控件(View)之TextView, Button, ImageButton, ImageView, CheckBox 简单介绍
- android中单位的简单介绍
- 2-8 Android 简单介绍 (一)
- Android 手机重力感应实现简单介绍
- 简单介绍如何应用DDMS协助开发Android Apps
- Android系统架构图及简单的系统架构介绍
- 简单介绍一下 设计模式在android中运用
- 简单介绍如何应用DDMS协助开发Android Apps
- android内置闹铃功能的简单介绍
- Android - 控件(View)之TextView, Button, ImageButton, ImageView, CheckBox, RadioButton, AnalogClock, DigitalClock 的简单介绍
- Android面试之----Android系统架构图及简单的系统架构介绍
- Android里的Boot Loader简单介绍