【转】EventBus 3.0使用详解

原文:https://www.jianshu.com/p/f9ae5691e1bbcss

01 前言

当咱们进行项目开发的时候,每每是须要应用程序的各组件、组件与后台线程间进行通讯,好比在子线程中进行请求数据,当数据请求完毕后经过Handler或者是广播通知UI,而两个Fragment之家能够经过Listener进行通讯等等。当咱们的项目愈来愈复杂,使用Intent、Handler、Broadcast进行模块间通讯、模块与后台线程进行通讯时,代码量大,并且高度耦合。如今就让咱们来学习一下EventBus 3.0吧。java

02 什么是EventBus

EventBus Github地址
进入官网,看看人家是怎么解释的:android

  • 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)
  • is proven in practice by apps with 100,000,000+ installs
  • has advanced features like delivery threads, subscriber priorities, etc.

大概的意思就是:EventBus可以简化各组件间的通讯,让咱们的代码书写变得简单,能有效的分离事件发送方和接收方(也就是解耦的意思),能避免复杂和容易出错的依赖性和生命周期问题。git

03 关于EventBus的概述

三要素

  • Event 事件。它能够是任意类型。
  • Subscriber 事件订阅者。在EventBus3.0以前咱们必须定义以onEvent开头的那几个方法,分别是onEvent、onEventMainThread、onEventBackgroundThread和onEventAsync,而在3.0以后事件处理的方法名能够随意取,不过须要加上注解@subscribe(),而且指定线程模型,默认是POSTING。
  • Publisher 事件的发布者。咱们能够在任意线程里发布事件,通常状况下,使用EventBus.getDefault()就能够获得一个EventBus对象,而后再调用post(Object)方法便可。

四种线程模型

EventBus3.0有四种线程模型,分别是:github

  • POSTING (默认) 表示事件处理函数的线程跟发布事件的线程在同一个线程。
  • MAIN 表示事件处理函数的线程在主线程(UI)线程,所以在这里不能进行耗时操做。
  • BACKGROUND 表示事件处理函数的线程在后台线程,所以不能进行UI操做。若是发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,若是果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。
  • ASYNC 表示不管事件发布的线程是哪个,事件处理函数始终会新建一个子线程运行,一样不能进行UI操做。

04 EventBus的基本用法

举个例子,我须要在一个Activity里注册EventBus事件,而后定义接收方法,这跟Android里的广播机制很像,你须要首先注册广播,而后须要编写内部类,实现接收广播,而后操做UI。因此,在EventBus中,你一样得这么作。bash

自定义一个事件类

public class MessageEvent{ private String message; public MessageEvent(String message){ this.message=message; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } } 

这里有些同窗,会有一些疑问,为何要创建这样一个类,有什么用途。其实这个类就是一个Bean类,里面定义用来传输的数据的类型。app

注册事件

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

当咱们须要在Activity或者Fragment里订阅事件时,咱们须要注册EventBus。咱们通常选择在Activity的onCreate()方法里去注册EventBus,在onDestory()方法里,去解除注册。ide

解除注册

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

发送事件

EventBus.getDefault().post(messageEvent); 

处理事件

@Subscribe(threadMode = ThreadMode.MAIN) public void XXX(MessageEvent messageEvent) { ... } 

前面咱们说过,处理消息的方法名字能够随便取。可是须要加一个注解@Subscribe,而且要指定线程模型。函数

05 EventBus使用实战

以上咱们讲了EventBus的基本用法,没有用过的同窗也不要担忧不会用,小编在这里举个小栗子。post

第一步:添加依赖

compile 'org.greenrobot:eventbus:3.0.0' 

第二步:定义消息事件类

public class MessageEvent{ private String message; public MessageEvent(String message){ this.message=message; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } } 

第三步:注册和解除注册

分别在FirstActivity的onCreate()方法和onDestory()方法里,进行注册EventBus和解除注册。

package com.example.lenovo.testapp.ui; import android.content.Intent; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.TextView; import com.example.lenovo.testapp.R; import com.example.lenovo.testapp.event.MessageEvent; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; /** * Created by ZZG on 2018/1/10. */ public class FirstActivity extends AppCompatActivity { private Button mButton; private TextView mText; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.first_activity); mButton = (Button) findViewById(R.id.btn1); mText = (TextView) findViewById(R.id.tv1); mText.setText("今天是星期三"); EventBus.getDefault().register(this); jumpActivity(); } private void jumpActivity() { mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(FirstActivity.this,SecondActivity.class); startActivity(intent); } }); } @Subscribe(threadMode = ThreadMode.MAIN) public void Event(MessageEvent messageEvent) { mText.setText(messageEvent.getMessage()); } @Override protected void onDestroy() { super.onDestroy(); if(EventBus.getDefault().isRegistered(this)) { EventBus.getDefault().unregister(this); } } } 

事件处理

在这里,事件的处理线程在主线程,是由于,我要让TextView去显示值。
在 SecondActivity里去进行事件的发送。

package com.example.lenovo.tezs; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import org.greenrobot.eventbus.EventBus; /** * Created by ZZG on 2018/1/10. */ public class SecondActivity extends AppCompatActivity { private Button mButton2; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.second_activity); mButton2=(Button) findViewById(R.id.btn2); jumpActivity(); } private void jumpActivity() { mButton2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { EventBus.getDefault().post(new MessageEvent("欢迎你们浏览我写的博客")); finish(); } }); } } 

很简单,当点击按钮的时候,发送了一个事件。

运行程序。

 
1.PNG

 

 

在FirstActivity中,左边是一个按钮,点击以后能够跳转到SecondActivity,在按钮的右边是一个TextView,用来进行结果的验证。
 
2.PNG

这是SecondActivity,在页面的左上角,是一个按钮,当点击按钮,就会发送了一个事件,最后这个Activity就会销毁掉。


 
3.PNG

此时咱们能够看到,FirstActivity里的文字已经变成了,咱们在SecondActivity里设置的文字。

总结

通过这个简单的例子,咱们发现EventBus使用起来是如此的方便,当咱们的代码量变得不少的时候,使用EventBus后你的逻辑很是的清晰,而且代码之间高度解耦,在进行组件、页面间通讯的时候,EventBus是一个不错的选择。

做者:梨子哥 连接:https://www.jianshu.com/p/f9ae5691e1bb 來源:简书 著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。
相关文章
相关标签/搜索