close
当前位置: 物联网在线 > 技术文库 > android >

Android EventBus 3.0 相见恨晚

为什么要用EventBus?它是干什么用的? EventBus是什么

EventBus是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。

这样一个简单的概念,可能让你不足以感受到EventBus的魅力。我们来思考一下下面这些情况。

使用购物类APP时,我们在商品详情页将商品加入购物车时,底部tab栏的购物车tab右上角的小数字也同步发生了变化。

面对这样的需求,一般情况下都是在详情页中提供一个接口,在tab栏所在的Activity(或者是Fragment)中注册这个接口,当点击事件发生是,回调这个接口,更新tab栏的内容。甚至有时候,由于我们的应用会是Activity+多个fragment 的组合,可能需要多个接口经过层层传递,才能实现某些在产品经理看来很简单的UI更新。

大部分APP在用户完成用户登录操作后,需要在返回界面同步更新用户信息。

这个时候,我们一般会在返回界面的onActivityResult方法中,通过requestCode及resultCode做出种种判断,最后在确认用户登录成功的情况下,请求用户信息完成UI的更新,这种体验其实是非常不好,作为一个用户希望的是,登录成功的同时完成用户信息的更新。

当然上面两种情况,用BroadcastReceiver实现,也是完全可以的,肯能会相对简单一些,但是从整体性能来说,这样是不好的;再者古人云,杀鸡焉用牛刀!!!

而EventBus的出现,很好的解决了这些让我们头疼的问题。首先就用一个简单的列子来实现一下用户登录信息异步更新的情况。

EventBus 3.0 使用Demo

这里用两个Activity简单的模拟常见的用户登录。效果图如下

Android EventBus 3.0 相见恨晚

登录

用户信息界面 public class FirstActivity extends AppCompatActivity { private Button btn; private Context mContext; //User Info private TextView userName; private ImageView usreImg; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContext = this; EventBus.getDefault().register(mContext); InitView(); } private void InitView() { setContentView(R.layout.activity_first); userName = (TextView) findViewById(R.id.userName); usreImg = (ImageView) findViewById(R.id.userImg); btn = (Button) findViewById(R.id.button); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(mContext, SecondActivity.class)); } }); } @Subscribe public void onUserEvent(UserEvent event) { userName.setText("用户名:" + event.nameStr); Glide.with(mContext).load(event.imgUrl).into(usreImg); } @Override protected void onDestroy() { EventBus.getDefault().unregister(mContext); super.onDestroy(); } } 用户登录界面 public class SecondActivity extends AppCompatActivity { private Context mContext; private Button btn; private EditText name; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContext=this; setContentView(R.layout.activity_second); name = (EditText) findViewById(R.id.name); findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //测试数据 String userImg = "http://img2.imgtn.bdimg.com/it/u=262221958,4109901128&fm=21&gp=0.jpg"; //这里只是为了方便测试,随便写的登录逻辑 String userName=""; if(!TextUtils.isEmpty(name.getText().toString())){ userName = name.getText().toString(); UserEvent userEvent = new UserEvent(userName, userImg); EventBus.getDefault().post(userEvent); }else { //不再发送事件Event Toast.makeText(mContext,"登录失败",Toast.LENGTH_SHORT).show(); } finish(); } }); } } UserEvent 类 public class UserEvent { public final String nameStr; public final String imgUrl; public UserEvent(String nameStr, String imgUrl) { this.nameStr = nameStr; this.imgUrl = imgUrl; } }

这里可以看到没有Handler,没有onActivityResult的判断,没有没有任何接口。就实现了如gif图中所示效果。

接下来,就总结一下如何使用EventBus3.0 。

EventBus 3.0 使用步骤

1.首先我们需要将EventBus添加到我们的项目中。在AndroidStudio中我们可以在gradle里面直接配置即可。

compile 'org.greenrobot:eventbus:3.0.0'

2.创建一个事件类(这个类似于JavaBean),就是上面的UserEvent类。

这里的Demo只是举例说明简单用法,实际中可以根据需要创建不同的事件类

3.注册

EventBus.getDefault().register(mContext);

4.订阅(响应事件方法)

@Subscribe public void onUserEvent(UserEvent event) { userName.setText("用户名:" + event.nameStr); Glide.with(mContext).load(event.imgUrl).into(usreImg); }
(责任编辑:ioter)

用户喜欢...

Android Weekly #276 安卓开发周刊 中文版

您是否了解过Android的Lifecycle-Aware库?(android.jlelse.eu) 我们如何了解Lifecycle-Aware库代码? Nishant Srivastava展示了可以跟踪活动或Lifecycle-Aware的Lifecycle Arch组件的片段,并相应地调整其行为。 为Mos...


Android Weekly #275 安卓开发周刊 中文版

MapMe — Android地图适配器 (medium.com) Josh Burton介绍MapMe,是一个用Kotlin编写的Android库,可以将适配器模式带到地图上。 赞助 CloudRail - 连接到API 10x更快 (cloudrail.com) 当我们用单一的界面连接到所...


使用Android Studio开发可独立运行(runnable)混淆过的Jar程序

之前开发Java程序一直都是使用Eclipse 开发Jar程序,现在开发基本上都已经弃用Eclipse了,但是有时偶尔开发个小的Jar程序,还要切换回去好麻烦,刚好前几天有人问几个相关的问题,就顺便整...


Android Weekly #274 安卓开发周刊 中文版

探索Android Oreo上的别后执行限制(medium.com) 在这篇文章中,Joe Birch解释了关于Android Oreo在后台运行服务的变化。 non-Time领主的time – 第5部分 (blog.stylingandroid.com) Mark Allison继续分析JSR 310 date和...


Android Weekly #273 安卓开发周刊 中文版

开源你的Android代码(android.jlelse.eu) 通过您的开源Android代码,您将(希望地)为Android社区提供有价值的代码,收到建设性的反馈,并与您最初建立的内容进行协作从而使您的代码变得更好。这...


Android Weekly #272 安卓开发周刊 中文版

Android Dev 101:每个初学者都应该知道的一些做法() 看一些初学者或媒介等级开发人员(不要错过任何人)应该知道的一些做法,以便更好地摆脱Android框架。 99.9% crash free sessions (medium.com) Chr...


Android Weekly #271 安卓开发周刊 中文版

依赖注入检查(medium.com) 在本文中,MihályNagy引入了依赖注入检查,一种开源注释处理器,可帮助您解决一些出现在所有JSR 330 DI库中常见的问题。 使用Android Studio插件提高效率 (blog.mindorks.com...


Android Weekly #270 安卓开发周刊 中文版

带有RxJava2的SOLID Android分析 (medium.com) 在这篇文章中,Aris Papadopoulos将解释如何正确创建一个分析系统,同时遵循SOLID原则,并使用RxJava2来解决问题。 (blog.stylingandroid.com) Java中的编程时间很难...


Android内存泄漏思考

Android内存泄漏是一个经常要遇到的问题,程序在内存泄漏的时候很容易导致OOM的发生。那么如何查找内存泄漏和避免内存泄漏就是需要知晓的一个问题,首先我们需要知道一些基础知识。...


Android Weekly #269 安卓开发周刊 中文版

在Google上快速提出操作 () Wolfram Rittmeyer分享了开始在Google上快速创建操作所需的所有信息(为了家庭与助理)。 RxJava中的错误处理(rongi.github.io) 一旦开始编写RxJava代码,你就会意识到有些事...