Android 第三方类库简单使用之EventBus

Android 第三方类库之EventBus

1 PS

工欲善其事必先利其器. Eventbus也是一款在开发中常用的利器

这篇也对EventBus的简单介绍和使用,与之前个xutils介绍的级别一样.http://www.cnblogs.com/greentomlee/p/6025470.html

作者:修雨轩陈 @博客园

2 简介

开源项目地址:

https://github.com/greenrobot/EventBus

EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。

Eventbus 的发布订阅(publish/subscribe)

Eventbus 有如下优点:

· simplifies the communication between components

  • decouples event senders and receivers
  • performs well with Activities, Fragments, and background threads
  • avoids complex and error-prone dependencies and life cycle issues

· makes your code simpler (对于程序员而言,可以简化代码)

· is fast (执行速度很快)

· is tiny (~50k jar) (类库的体积很小,大约只有50k)

· is proven in practice by apps with 100,000,000+ installs

· has advanced features like delivery threads, subscriber priorities, etc.

3 环境搭建三部曲

3.1 资源下载

在github中将开源类库下载到本地:

https://github.com/greenrobot/EventBus

作者提供的很详细的说明文档, 我是参考作者的文档写出的.在github主页中也有简单使用步骤.

http://greenrobot.org/eventbus/documentation/how-to-get-started/

3.2 项目环境搭建

-------------

软件环境: Android Studio2.3 Beta3

在github中下载下来的eventbus

----------------

首先, 新建一个测试项目: TestEventBus

然后我们观察一下下载的eventbus的目录结构,并确定要导入的模块是哪一个

通过对目录中的结构分析,我们知道了:

在EventBus-master 下是有3个模块可以供我们导入项目里面的。 分别是:EventBus、EventBusAnnotationProcessor、EventBusPerformance。根据编程习惯我们知道:应该导入EventBus目录。

确定了导入的类库之后,

在该项目下新建导入的模块

选择‘evenbus’ 目录进行导入。

导入成功之后的结构如下:

接下来就是对build.gradle进行编辑(注意build.gradle文件所在的目录)

在文件中写入这句话:

compile project(‘:EventBus‘)

这是因为我们模块名称就是 EventBus

(build.gradle写入的依赖类库的名字应该与导入EventBus之后的模块名称 保持一致)

3.3 测试使用

首先描述一下我们要做什么:

为了对比intent传递参数和Event bus 传递参数的区别,同时也为了练习使用EventBus , 我们准备了两个Activity : MainActivity 和SendMsgActivity

首先利用使用传统的消息传递的方式, 将消息从MainActivity发送到SendMsgActivity上;

然后利用Eventbus 再将新的消息从SendMsgActivity传递到MainAvtivity上。

PS 利用intent传递消息的这部分不在赘述

3.3.1 在接受消息的地方注册和注销消息

首先看MainActivity

由于需要接收来自SendMsgActivity的EvenBus消息, 所以需要新建一个实例注册eventBus,注册的动作应该写在onStart()回调函数中.

@Override
protected void onStart() {// 注册event bus     super.onStart();     EventBus.getDefault().register(this);
}

同时档程序销毁的时候,也需要注销:

@Override
protected void onDestroy() {// 注销eventBus     super.onDestroy();     EventBus.getDefault().unregister(this);
}
3.3.2 在发送消息的地方写发送方法

SendMsgAcitivty 会使用Eventbus 发送消息, 那么他就是消息发送的地方.

细心的同学发现了, 我并没有在intent里面传递参数. 而是使用了

ventBus.getDefault().post()

方法类发送消息. 关键代码如下:

sendBtn.setOnClickListener(new View.OnClickListener() {     @Override     public void onClick(View view) {         EventBus.getDefault().post(new MessageEvent("来, 给你发送一个消息..."));

         Intent intent = new Intent(SendMsgActivity.this, MainActivity.class);         startActivity(intent);

     }
});

其中 MessageEvent 是自定义个的 实体(结构体\bean)

public class MessageEvent {     public String msg="";     public MessageEvent(String msg)     {         this.msg = msg ;     }

     public String getMsg() {         return msg;     }

     public void setMsg(String msg) {         this.msg = msg;     }
}
3.3.3 在消息接受的地方书写接受消息的动作

消息接受的地方(MainActivity)中接收消息的方法如下:

/**  * 处理接受消息的方法  “subscriber methods”  * 也可以使用注释  * @link http://greenrobot.org/eventbus/documentation/how-to-get-started/  *  * @param evnt  */
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(MessageEvent evnt)
{     String msg = evnt.getMsg();     //this.showMsgTv = (TextView) findViewById(R.id.tv_printer);     //this.showMsgTv.setText(msg);     Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
}

出现的效果如图下:

4 扩展阅读

EventBus & Otto的使用和比较

http://www.jianshu.com/p/cb39a0018db1

RxJava和EventBus的区别?

https://www.zhihu.com/question/32179258

http://bbs.csdn.net/topics/392007033

时间: 2024-10-16 23:39:44

Android 第三方类库简单使用之EventBus的相关文章

android studio中导入第三方类库

http://zhidao.baidu.com/link?url=W0zaTJAdd4qiJ2PwIGK39bqjQ3-a8CxA-EZb1M9FQZGnPHMfxPzn0h1AoPED-ix7GiSgfDV0EGKtl_9TJXyqaje0BTCTuZ2VOLI8PSoI4nq 下面分两种情况介绍一下如何导入第三方类库. 1.对于jar的类库,非常简单,只要在项目根目录下新建一个libs目录,然后把jar复制进去,在jar上点击右键,选择Add as library,即可完成依赖的添加. 2.

Android实战技巧之十二:Android Studio导入第三方类库、jar包和so库

第三方类库源码 将一网友的XMPP代码从ADT转到AS时,发现其使用了第三方类库,源码放在了lib下,直接在AS中Import project,第三方类库并没有自动导入进来,看来需要自己动手了. 项目的目录结构如下: XMPP$ ls app build.gradle gradlew import-summary.txt XMPP.iml build gradle gradlew.bat local.properties settings.gradle 1 2 3 1 2 3 将第三方源码qqE

android studio 引入第三方类库jar包

第三方类库jar包 这就简单多了,直接将jar包拷贝到app/libs下,然后在app下的build.gradle中添加此jar的依赖.如下: dependencies { compile 'com.android.support:support-v4:19.1.0' compile files('libs/libammsdk.jar') compile files('libs/universal-image-loader-1.8.6-with-sources.jar') compile fil

Android Studio加入第三方类库

初学Android三个月,UI老大难,于是决定到GitHub上下载几个高大上的UI效果装一下门面.但是下下来,却发现不会将第三方类库导入到自己的工程中,折腾了很久.由于网上很多博主的教程可能版本与我的Android Studio不同,界面都不一样,所以在他们手把手地教导下,我还是摸索了很久.现在把导入方法记录下来,以防以后忘记. 1.我下载的是一个叫satellite-menu的类库.如下图,satellite-menu是类库,satellite-menu-sample是这个类库的使用示例. 2

Android studio导入第三方类库源码以及jar包

新建一个Android项目,项目结构如下: 1.添加第三方类库源码 首先将第三方类库考入与app同级的目录下: 之后,在build.gradle(Moudule:app)下添加编译代码:在setings.gradle添加导入代码 之后添加(可一新增一个Module) 然后将之删除,自己到入得第三方的build.gradle 会自动生成 如下,则完成. apply plugin: 'com.android.library' android { compileSdkVersion 25 buildT

Android Studio第四期 - 导入第三方类库的方法

1.开发过程中想要导入第三方类库和Eclipse也是有差别的,我们导入shapeloading这个类库,从github上下载下来解压到项目目录下. 2.然后我们重启我们的android studio就会发现我们的项目下面有了我们的类库 然后我们需要修改的是我们根目录的下的settings.gradle这个文件,一定要注意是根目录下的.在里面添加如图所示的代码 添加的是我们类库的名字,只能是手动修改.这点我也很无奈. 3.接下来我们还要修改的是App目录下的build.gradle,这里要注意是A

android 升级ADT22版本后,使用第三方类库项目报错:java.lang.NoClassDefFoundError:xx.xx.xx

用友盟的分享sdk遇到了这个问题:java.lang.NoClassDefFoundError:com.umeng.socialize.controller.UMServiceFactory. 产生原因:android ADT版本升级后产生的. 解决办法:①.build path-->order and export中把第三方jar包的位置上调: ②.如果第一种办法不好用,请试一试,右击项目名称-->Build path-->configure build path.. 此时会弹出类库设

Android实战技巧之十二:Android Studio导入第三方类库

将一网友的XMPP代码从ADT转到AS时,发现其使用了第三方类库,源码放在了lib下,直接在AS中Import project,第三方类库并没有自动导入进来,看来需要自己动手了. 项目的目录结构如下: XMPP$ ls app build.gradle gradlew import-summary.txt XMPP.iml build gradle gradlew.bat local.properties settings.gradle 将第三方源码qqEmoji-lib拷到此目录,修改sett

Android下面第三方类库资源文件的加载

有些第三方类库是基于J2SE开发的,内部有资源文件,如properties,这些文件在dex编译的时候会被过滤掉,导致类读取资源的时候无法访问. 解决办法是用运行时加载第三方类库. 1.用DX打包第三方类库 2.把打包后的DEX文件和带目录结构的资源文件,压缩到classes.zip文件里面 3.对Classes.zip进行运行时加载.加载方法见上一个博客