EventBus的初步接触

原创 2016年08月28日 23:26:11

在项目开发过程中,我们对onActivityForResult一定不陌生,通常我们希望从当前Activity/Fragment跳到另一个Activity/Fragment去进行一些事件的处理,处理完后将结果发送给第一个Activity/Fragment,这会儿我们就可以重写onActivityForResult,可是在大量的实践下,发现如果如果只有一个Activity进行结果处理,一个Activity发送结果,这种情况下使用onActivityForResult还不算麻烦,但有些情况使用onActivityForResult太过麻烦,比如:我在第一个Activity重写onActivityForResult对返回的结果进行处理,但我需要相继跳转两个或更多的Activity直到有一个Activity处理了事件并setResult,这样的情况就不适合使用onActivityForResult,而引入EventBus就可以轻松地解决这样的问题。

EventBus的好用之处就在于:它是一个基于观察者模式的事件发布/订阅框架,开发者可以通过极少的代码去实现多个模块之间的通信,而不需要以层层传递接口的形式去单独构建通信桥梁。从而降低因多重回调导致的模块间强耦合,同时避免产生大量内部类。

下面就来看看EventBus的使用方法:

  • 首先向AS项目里添加gradle依赖:
// EventBus
compile 'org.greenrobot:eventbus:3.0.0'
  • 在需要进行事件处理的Activity/Fragment的onCreate或者构造方法里进行注册:
EventBus.getDefault().register(this);
  • 订阅处理事件
@Subscribe  
public void onEvent(AnyEventType event) {/* Do something */};

这里有两点需要注意:

1.这里的AnyEventType必须是可以进行实例化的对象类型,不能是简单类型如int、double等。
2.这个@Subscribe后面不接任何ThreadMode则表示事件处理在事件发送的那个线程执行

  • 发送事件
EventBus.getDefault().post(event);
  • 别忘了要注销
@Override
    protected void onDestroy() {
        super.onDestroy();
        eventBus.unregister(this);
    }

只需这四步就搞定了,非常简单。

下面来看看具体代码实现:
MainActivity.java

@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FrameLayout container = new FrameLayout(this);
        container.setId(R.id.container);
        setContentView(container);
        EventBus.getDefault().register(this);
        ...
    }

@Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onReloadPage(String resultCode) {
        if ("OK".equals(resultCode)) {
           //do something
        }
    }

LastActivty.java

@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finishActivity();
            }
        });
    }

public void finishActivity() {
        String result = "OK";
        EventBus.getDefault().post(result);
        finish();
    }

顺带说一下关于ThreadMode:
查看源码可以发现这是个枚举类型,包含:POSTING,MAIN,BACKGROUND,ASYNC

ThreadMode 含义
POSTING 事件处理在事件发送的那个线程执行
MAIN 事件在主线程-UI线程执行
BACKGROUND 事件在一个后台线程执行(就一个后台线程)
ASYNC 事件会单独启动一个线程执行(每个事件都会启动一个线程)

还有一点不得不说的:

  • 注册和事件处理必须在post之前就要进行,否则是不会进行事件处理的。

由于楼主也是才接触EventBus,只是用了EventBus的简单功能,这个Bus其他强大的功能没有深入接触,所以本文只是简单介绍下EvenBus的简单使用方法,有兴趣的朋友可以去了解一下EventBus的其他功能。^_^

版权声明:本文为博主原创文章,未经博主允许不得转载。

AndroidEventBus新特性:添加粘性事件、不需要手动注销事件总线

刚看了下作者发布的新版本AndroidEventBus v1.0.4版本,发现加了很多好东东,最大的两个特性就是添加了粘性sticky事件和无需手动注销事件 AndroidEvent...
  • hanhailong726188
  • hanhailong726188
  • 2015年06月01日 17:36
  • 3057

Eventbus的第一次接触

一、概述 EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之...
  • qq_30562339
  • qq_30562339
  • 2016年07月22日 11:52
  • 535

第一次接触EventBus

在使用它的时候,感觉在控件之间的通讯可能会用上,所以我就记录下来,方便自己的学习.思路不是很清晰.望见谅.! EventBus 个人理解:   假如有A B    2个Activity 我们在...
  • QQ541159192
  • QQ541159192
  • 2016年01月28日 23:48
  • 372

一个新手接触EventBus

什么都不要说,,直接跑到开源库去看介绍,发现有介绍文档,内心激动啊,感觉十万匹黑马在奔腾。我了个去,赶紧打开,提起袖子,就是撸代码。 https://github.com/greenrobo...
  • qq_35270692
  • qq_35270692
  • 2017年08月13日 14:51
  • 106

servlet————初步接触一

学习的用的是Tomcat服务器:   打开解压完的文件夹: 在lib文件夹里面,大概需要掌握怎么启动和关闭服务器:startup.bat是启动Tomcat服务器,shutdown.bat...
  • c1163208826
  • c1163208826
  • 2015年08月03日 17:53
  • 109

初步接触Linux!

第一次接触到Linux ,对自己所学的知识进行一个汇总。 嵌入式操作系统主要有软件子系统和硬件子系统组成,其中可细分编程及硬件。 su:切换用户           exit:返回到上一层用户,若当前...
  • IamSherly
  • IamSherly
  • 2017年11月06日 20:46
  • 32

一 初步接触python

1.1、在网上下载python(版本不一样,有差异) 1.2、Python的语言特性 1.3、如何获取帮助...
  • suncaiyun_hello
  • suncaiyun_hello
  • 2015年12月19日 16:13
  • 307

docker的初步接触

LXC的介绍 概述 LXC(linux容器技术)为linux container 的简写,是一种内核虚拟化技术。 LXC可以提供轻量级的虚拟化,以隔离进程和资源,而且不需要提供指令解释机制以...
  • tongyijia
  • tongyijia
  • 2016年09月21日 00:29
  • 202

GLFW初步接触

计算机系的同学帮忙写的程序用的是freeglut。这是一个完全兼容于原来的glut库的开源库,不过我之前也没接触过glut,只知道是一个能用来创建窗口(后来大概知道还有些诸如“上下文”的专业名词)的库...
  • u010462297
  • u010462297
  • 2014年09月30日 21:28
  • 3583

初步接触正则表达式

记录一下这两天接触的正则表达式 一、基本知识 1.定义:符合一定规则的表达式 2.作用:用于专门操作字符串。 3.特点:用于一些特定的符合来表示一些代码操作,这样就简化了书写,所以学习正则表达...
  • kunfd
  • kunfd
  • 2016年10月19日 14:34
  • 87
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:EventBus的初步接触
举报原因:
原因补充:

(最多只允许输入30个字)