开源框架EventBus(一)
1 什么事EventBus
EventBus是一个android事件发布/订阅的高性能框架,主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息。优点是开销小,代码更简洁优雅,事件发布者和事件接收者之间的耦合度更小。如果您目前的项目的逻辑非常复杂,例如组件、线程之间大量传参,频繁使用广播的话维护起来比较吃力的话,或许EventBus是一个非常好的选择。
2 优点
- 可以简化android组件(activity、service、broadcast)以及后台线程之间的通讯
- 减少事件发布者和接收者之间的耦合度
- 可以避免使用复杂的逻辑、减少事件发送者和接收者之间易错的依赖,避免由于组件生命周期带来的一系列问题
- 使用非常简单
- 效率非常高
- 轻量级(jar小于50k)
- 目前有1000W的app在使用
- 先进的功能例如:线程调度,支持事件接收的优先级等
3 EventBus实战
3.1 定义一个事件类
package com.sohu.eventbustest; /** * Created by yuliu207272 on 2015/5/15. */ public class MessageEvent { private String msg; public MessageEvent(String msg) { this.msg = msg; } public String getMsg(){ return msg; } }
3.2 在activity中的onCreate()方法中注册事件
EventBus.getDefault().register(MainActivity.this);
3.3 定义接收消息的方法
public void onEvent(MessageEvent event){ String msg = event.getMsg(); tvText.setText(msg); Log.e(Tag, msg); }
查阅EventBus官方文档可知
接收事件规定有4种
onEvent: 使用onEvent作为订阅函数,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行也就是说发布事件和接收事件线程在同一个线程。使用这个方法时,在onEvent方法中不能执行耗时操作如果执行耗时操作容易导致事件分发延迟。声明下,app中所有的Activity都是在主线程中绘制的。
onEventMainThread:使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行这个在Android中是非常有用的,因为在Android中只能在UI线程中跟新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。
onEventBackgroundThread: 使用onEventBackgrond作为订阅函数,那么如果事件是在UI线程中发布出来的那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么onEventBackground函数直接在该子线程中执行。
onEventAsync:使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行
mainActivity:
public class SendMessageActivity extends Activity { private EditText etText; private Button btnSend; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_send_message); etText = (EditText)findViewById(R.id.et_text); btnSend = (Button)findViewById(R.id.btn_send); btnSend.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(!TextUtils.isEmpty(etText.getText())){ String sendMessage = etText.getText().toString(); EventBus.getDefault().post(new MessageEvent(sendMessage)); } } }); } }
注意:方法中接收的MessageEvent和后面post方法中MessageEvent必须要是一种类型才能接收到消息3.4 发送消息
再新建一个SendMessageActivity,里面一个输入框输入要发送的消息,点击发送后,MainActivity就会收到消息了。
SendMessageActivity:
public class SendMessageActivity extends Activity { private EditText etText; private Button btnSend; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_send_message); etText = (EditText)findViewById(R.id.et_text); btnSend = (Button)findViewById(R.id.btn_send); btnSend.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(!TextUtils.isEmpty(etText.getText())){ String sendMessage = etText.getText().toString(); EventBus.getDefault().post(new MessageEvent(sendMessage)); } } }); } }
布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:orientation="vertical" tools:context="com.sohu.eventbustest.SendMessageActivity"> <EditText android:id="@+id/et_text" android:layout_width="fill_parent" android:layout_height="60dip" /> <Button android:gravity="center" android:textSize="18sp" android:textColor="#000000" android:id="@+id/btn_send" android:layout_width="match_parent" android:layout_height="60dip" android:text="发送消息"/> </LinearLayout>
3.4 测试结果
在SendMessageActivity中的EditText中输入:eventBus message from MrLiu,点击发送后,按返回键,在MainActivity查看
eventBus进阶:http://1029457926.iteye.com/blog/2211820
相关推荐
在之前的博文中简单介绍过如何实现fragment之间的信息交互:《Android中Fragment与Activity之间的交互(两种实现方式)》,今天继续给大家介绍一种可以实现此效果的另外一种方式EventBus。(相比于handler,接口回调...
十大Android开源框架源码学习:rxjava,picasso,okhttp,retrofit,glide,butterknife,eventbus,dagger2等等。
好了,既然能想到这个设计模式,那么就来看一个屌爆天的Android开源框架EventBus。主要功能是替代Intent、Handler、BroadCast在Fragment、Activity、Service、线程之间传递消息。他的最牛逼优点是开销小,代码简洁,...
第1章 课程介绍 第2章 Okhttp网络库深入解析和相关面试题...第8章 eventbus异步框架源码解析 第9章 dagger2依赖注入框架源码解析 第10章 rxjava异步框架源码解析 第11章 picasso图片框架源码解析 第12章 课程总结
EventBus是一个非常强大的开源框架,可以同线程,跨线程传递事件,利用反射机制触发。总所周知,安卓无法在子线程中操控ui控件,此框架可以解决这个问题,而且在大项目,非常频繁的需要跨线程传递事件的时候,方便的...
针对面试常问的几种开源框架的源码详解,EventBus/Retrofit/RxJava/Volley/okHttp/Binder机制等
这是一个Android平台的事件总线框架, 它简化了Activity、Fragment、Service等组件之间的交互,很大程度上降低了它们之间的耦合,使得我们的代码更加简洁,耦合性更低,提升我们的代码质量。在往下看之前,你可以考虑...
包含eventbus ,glide ,okhttp ,android事件分发等众多android框架的源码解析
内部是一个TXT文件。里面有百度云盘的视频。 最值得深入学习的十大框架: 网络框架:OkHttp Retrofit 异步处理:RxJava EventBus 图片加载:Glide Picasso 依赖注入:ButterKnife Dagger2 性能优化:Leakcanary ...
5验证框架(集成开源框架) 6 json解析(支持解析成集合或者对象) 7 数据库(不知道是哪位写的 忘记了) 8 多线程断点下载(自动判断是否支持多线程,判断是否是重定向) 9 自动更新模块 上拉加载下拉刷新 10 一...
自动注入框架(只需要...验证框架(集成开源框架) json解析(支持解析成集合或者对象) 数据库(不知道是哪位写的 忘记了) 多线程断点下载(自动判断是否支持多线程,判断是否是重定向) 自动更新模块 一系列工具类
AOSF:AOSF:全称为Android开放源代码框架,即Android优秀开源框架汇总。包含:网络请求okhttp,图片下载glide,数据库greenDAO,链式框架RxJava,组件路由ARouter,消息传递通信EventBus,热更新Tinker,插件化框架...
EventBus是一个Android事件发布/订阅的轻量级框架,基于观察者模式,将事件的接收者和发送者分离,主要是替代intent,Handler,BroadCast在Fragment,activity,service线程之间传递消息。作为GitHub上的人气开源项目...
(5) 验证框架(集成开源框架) (6) json解析(支持解析成集合或者对象) (7) 数据库(不知道是哪位写的 忘记了) (8) 多线程断点下载(自动判断是否支持多线程,判断是否是重定向) (9) 自动更新模块 (10) 一...
(5) 验证框架(集成开源框架) (6) json解析(支持解析成集合或者对象) (7) 数据库(不知道是哪位写的 忘记了) (8) 多线程断点下载(自动判断是否支持多线程,判断是否是重定向) (9) 自动更新模块 (10) 一...
Estore 一个模仿淘宝商城的app 简介 一个模仿淘宝商城的app 客户端:estore 服务端:estoreService 使用aidl消息模仿 服务器传递数据 ...使用到的开源框架 EventBus; ButterKnife; Dagger2; litepal; fresco;
没看过EventBus的原始代码,但是个人感觉此项目足够简洁高效,易懂易用!DBus项目突出的特点: 1,注册消息事件的类可以是任意类(可能别人的项目也是),不限定是Activity等特殊的类。只要你保证register和...
一位练习时长两年半的安卓练习生根据鸿神提供的WanAndroid开放Api来制作的产品级App,基本实现了所有的功能,采用Kotlin语言,基于Material Design AndroidX MVP RxJava Retrofit等优秀的开源框架开发,注释超详细,...