在Android中,接口回调已经能够处理掉大部分业务需求了,实在太变态的需求就用广播也能够完成,自己写的性能好出问题也好解决。。。。。工作需要,不得不看看EventBus的用法,今天就来介绍一下学习经验。

首先就是引入这个东东,我是直接在maven上下载的jar包,下载地址:
http://search.maven.org/#search|ga|1|g%3A%22de.greenrobot%22%20AND%20a%3A%22eventbus%22

下载完成之后,拷贝到我们的项目之中就可以使用了。

1.注册事件订阅者

使用EventBus我们首先要注册事件订阅者,这个事件订阅者就是说我们订阅的事件一会要在哪里进行处理,事件订阅者的注册和广播注册非常相似,有注册,也有解除注册,一般情况下,我们在Activity的onCreate()方法中进行注册,在Activity的onDestory()方法中解除注册。OK,代码如下:

注册:

EventBus.getDefault().register(this);

解除注册:

EventBus.getDefault().unregister(this);

所以完整的代码应该是这个样子:

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);
} @Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}

2.构造发送消息类

注册号事件订阅者之后,第二步就是构造发送消息类,这个类就是我们要发送的对象,所以这个类怎么写都行,只要你把要传递的东西能够存进这个对象中又能够从这个对象中拿出来就好。OK,我写了一个简单的消息类,如下:

public class MainMessage {
private String msg; public MainMessage(String msg) {
this.msg = msg;
} public String getMsg() {
return msg;
}
}

说白了,就一个Java Bean。

3.发送消息

下来就是发送消息,发送消息也很简单,代码如下:

EventBus.getDefault().post(new MainMessage("Hello EventBus"));

就一行代码,发送了一个EventBus对象,在构造这个对象的时候,在它的构造方法中传入了一个参数,那就是Hello EventBus,如果你想要传递更多的消息内容,那么你只需要丰富这个MainMessage类就可以了。OK,那我们的消息发送到哪里去了?

4.消息接收

最后一步,就是消息的接收,看看我们是怎么接收消息的:

    //主线程中执行
@Subscribe(threadMode = ThreadMode.MainThread)
public void onMainEventBus(MainMessage msg) {
Log.d(TAG, "onEventBus() returned: " + Thread.currentThread());
}

首先我定义了一个方法,这个方法名称我可以随意取,没有关系,这个方法有一个注解,@Subscribe,Subscribe本身的含义是订阅,有了这个注解就说明这个方法就是用来响应EventBus发送的事件的,OK,这个注册中还有一行代码,

threadMode = ThreadMode.MainThread,这个又表示什么意思呢?这个表示我们的这个方法在主线程中执行,除了在主线程中执行之外,还能在哪里执行呢?看下面三个方法:
    //后台线程
@Subscribe(threadMode = ThreadMode.BackgroundThread)
public void onBackgroundEventBus(BackgroundMessage msg) {
Log.d(TAG, "onEventBusBackground() returned: " + Thread.currentThread());
} //强制后台执行
@Subscribe(threadMode = ThreadMode.Async)
public void onAsyncEventBus(AsyncMessage msg) {
Log.d(TAG, "onEventBusAsync() returned: " + Thread.currentThread());
} //默认情况,和发送事件在同一个线程
@Subscribe(threadMode = ThreadMode.PostThread)
public void onPostEventBus(PostMessage msg) {
Log.d(TAG, "onEventBusPost() returned: " + Thread.currentThread());
}

ThreadMode.BackgroundThread表示让该方法在后台执行,ThreadMode.Async也表示在后台执行,不同的是这里表示消息发送方不必等待后台线程完就可以接着往下执行。最后一个ThreadMode.PostThread表示该方法和消息发送方在同一个线程中执行。
那么针对这种不同类型的方法,我分别打印了日志,如下:

很简单吧。
好了,最后放出完整的代码,如下:

public class MainActivity extends AppCompatActivity {

    private TextView tv;
private final static String TAG = "EventBusTest"; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = ((TextView) findViewById(R.id.tv));
EventBus.getDefault().register(this);
} @Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
} public void btnClick(View view) {
switch (view.getId()) {
case R.id.btn1:
EventBus.getDefault().post(new MainMessage("Hello EventBus"));
break;
case R.id.btn2:
EventBus.getDefault().post(new BackgroundMessage("Hello EventBus"));
break;
case R.id.btn3:
EventBus.getDefault().post(new AsyncMessage("Hello EventBus"));
break;
case R.id.btn4:
EventBus.getDefault().post(new PostMessage("Hello EventBus"));
break;
}
} //主线程中执行
@Subscribe(threadMode = ThreadMode.MainThread)
public void onMainEventBus(MainMessage msg) {
tv.setText(msg.getMsg());
Log.d(TAG, "onEventBus() returned: " + Thread.currentThread());
} //后台线程
@Subscribe(threadMode = ThreadMode.BackgroundThread)
public void onBackgroundEventBus(BackgroundMessage msg) {
Log.d(TAG, "onEventBusBackground() returned: " + Thread.currentThread());
} //强制后台执行
@Subscribe(threadMode = ThreadMode.Async)
public void onAsyncEventBus(AsyncMessage msg) {
Log.d(TAG, "onEventBusAsync() returned: " + Thread.currentThread());
} //默认情况,和发送事件在同一个线程
@Subscribe(threadMode = ThreadMode.PostThread)
public void onPostEventBus(PostMessage msg) {
Log.d(TAG, "onEventBusPost() returned: " + Thread.currentThread());
}
}

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<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:orientation="vertical"> <Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="btnClick"
android:text="发送消息到主线程执行"/> <Button
android:id="@+id/btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="btnClick"
android:text="发送消息到后台线程执行"/> <Button
android:id="@+id/btn3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="btnClick"
android:text="发送消息到后台线程强制执行"/> <Button
android:id="@+id/btn4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="btnClick"
android:text="发送消息--和发送方同一线程执行"/> <TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"/>
</LinearLayout>

就这些。

EventBus3.0使用总结的更多相关文章

  1. EventBus3.0源码解析

    本文主要介绍EventBus3.0的源码 EventBus是一个Android事件发布/订阅框架,通过解耦发布者和订阅者简化 Android 事件传递. EventBus使用简单,并将事件发布和订阅充 ...

  2. Android -- 从源码带你从EventBus2.0飚到EventBus3.0(一)

    1,最近看了不少的面试题,不管是百度.网易.阿里的面试题,都会问到EventBus源码和RxJava源码,而自己只是在项目中使用过,却没有去用心的了解它底层是怎么实现的,所以今天就和大家一起来学习学习 ...

  3. Android -- 从源码带你从EventBus2.0飚到EventBus3.0

    1,最近看了不少的面试题,不管是百度.网易.阿里的面试题,都会问到EventBus源码和RxJava源码,而自己只是在项目中使用过,却没有去用心的了解它底层是怎么实现的,所以今天就和大家一起来学习学习 ...

  4. Android事件总线(二)EventBus3.0源码解析

    1.构造函数 当我们要调用EventBus的功能时,比如注册或者发送事件,总会调用EventBus.getDefault()来获取EventBus实例: public static EventBus ...

  5. Android事件总线(一)EventBus3.0用法全解析

    前言 EventBus是一款针对Android优化的发布/订阅事件总线.简化了应用程序内各组件间.组件与后台线程间的通信.优点是开销小,代码更优雅,以及将发送者和接收者解耦.如果Activity和Ac ...

  6. Android之EventBus1.0 和EventBus3.0的使用详解

    当Android项目越来越庞大的时候,应用的各个部件之间的通信变得越来越复杂,那么我们通常采用的就是Android中的解耦组件EventBus.EventBus是一款针对Android优化的发布/订阅 ...

  7. Android中使用开源框架EventBus3.0实现Fragment之间的通信交互

    1.概述 在之前的博文中简单介绍过如何实现fragment之间的信息交互:<Android中Fragment与Activity之间的交互(两种实现方式)>,今天继续给大家介绍一种可以实现此 ...

  8. Android事件总线分发库EventBus3.0的简单讲解与实践

    Android事件总线分发库EventBus的简单讲解与实践 导语,EventBus大家应该不陌生,EventBus是一款针对Android优化的发布/订阅事件总线.主要功能是替代Intent,Han ...

  9. EventBus3.0 study

    概述 eventbus出来很久了,最近想用一下eventbus,自己对着一些博客撸了一个demo,发现竟然crash了,然后去看看源码发现3.0的eventbus有了很多改动.技术变化真快,得保持谦虚 ...

随机推荐

  1. wzplayer for android V1.5.3 (新增YUV文件播放)

    wzplayer for android V1.5.3 新增功能 1.使用gl es2 播放 yuv 文件. 联系方式:weinyzhou86@gmail.com QQ:514540005 版权所有, ...

  2. C++中的类所占内存空间总结

    C++中的类所占内存空间总结    最近在复习c++的一些基础,感觉这篇文章很不错,转载来,大家看看! 类所占内存的大小是由成员变量(静态变量除外)决定的,成员函数(这是笼统的说,后面会细说)是不计算 ...

  3. hdu4722Good Numbers(dp)

    链接 这题规律其实挺明显的 打表找规律估计都可以 正规点就是DP 算出第N位所包含的good number的数量 如果给出的数是N+1位 就枚举各位上比原来小的数 加上下一位的dp值 一个i写成g了 ...

  4. 函数page_cur_search_with_match

    /****************************************************************//** Searches the right position fo ...

  5. MVC3.0 中Razor 学习

    随着MVC3.0RTM版本的发布,最近将公司的项目从MVC2.0升级到MVC3.0.同时打算在MVC3中全面使用Razor模板引擎.现将Razor学习拿出来和大家分享,如果存在不足的地方欢迎您指出. ...

  6. mysql 查看死锁和去除死锁

    1.查询是否锁表show OPEN TABLES where In_use > 0; 2.查询进程 show processlist 3.  查询到相对应的进程,然后 kill id 验证(ki ...

  7. C# using Sendkey function to send a key to another application

    If notepad is already started, you should write: // import the function in your class [DllImport (&q ...

  8. Linux设备驱动中的异步通知与异步I/O

    异步通知概念: 异步通知的意识是,一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上的“中断”概念,比较准确的称谓是“信号驱动的异步IO”,信号是在软件层次 ...

  9. HDU4763 - Theme Section(KMP)

    题目描述 给定一个字符串S,要求你找到一个最长的子串,它既是S的前缀,也是S的后缀,并且在S的内部也出现过(非端点) 题解 CF原题不解释....http://codeforces.com/probl ...

  10. HDU1247 - Hat’s Words(Trie树)

    题目大意 给定一些单词,要求你把所有的帽子单词找出来,如果某个单词恰好由另外两个单词连接而成,那么它就是帽子单词 题解 先把所有单词插入到Trie树,然后判断每个单词是不是帽子单词,做法就是:对于第i ...