EventBus事件总线分发库

compile 'de.greenrobot:eventbus:2.4.0'

1)使用起来特别简单,但是要懂原理;

2)要注意使用的步骤和流程;

3)主要作用:组件之间相互通讯、线程之间相互通讯等


Event BusOtto事件总线分发库


什么是事件总线管理?

1) 将事件方法队列里,通过队列进行事件的管理和分发!

2)保证应用的各个部分之间高效的通讯及数据、事件分发!

3)模块之间的解耦 不用写网络请求接口回调了,直接通过EventBus传递数据。(通过接口回调传递数据、通过EventBus传递数据)

Event Bus是一个发布/订阅的事件总线。Event Bus模式也被称之为Message Bus或者发布者/订阅者模式,可以让两个组件相互通信,但是它们之间并不相互知晓。有些类似于广播机制。

1)在需要接收信息的地方,进行一个订阅和注册;

2)在发送数据的地方进行发布

3)然后在订阅的地方就可以收到,并进行处理。


基于事件总线管理/订阅/分发模式。事件响应有更多线程选择EventBus可以向不同的线程中发布事件。

使用时需要先注册订阅,发布者然后向订阅者分发消息数据即可。订阅者可以订阅多个事件,发布者可以发布任何事件;发布者同时也可以是订阅者。分订阅、注册、发布、取消注册等步骤。

Event Bus包含四个部分:发布者、订阅者、事件、总线。

Event Bus分发流程:

1)发布者首先把它的事件传递到Event Bus事件总线里面进行管理,等待分发;

2)事件总线按照相应的逻辑,把事件发布给定阅者;

3)然后订阅者就可以接收到数据(通过对应的方法进行接收),进行相应的处理。

Event Bus基于标准的命名规范,注解模式比较消耗内存,所以Event Bus效率上要高一些。Event Bus支持交互线程的事件传递(支持主线程和子线程的通讯)Event Bus传递效率比较快。

基于数据解耦通讯的相关app

post()方法里面的类型和onEvent()中的类型要一致

package com.lantu.tuhuadmin.eventbus;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import de.greenrobot.event.EventBus;

/**
 * Created on 2016/7/13.
 * Author:chenrushui
 * Description:一处点击发送数据,另一处或者多处可以及时获取更新传递过来的数据
 * 设计知识点:事件类自定义、注册、订阅事件、事件的发布、数据解析、取消注册;
 */
public class FirstActivity extends Activity implements View.OnClickListener {

    private Button btn_send;
    private TextView tv_content;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first);

        initViews();
        initListener();
        //注册一个事件接收者
        EventBus.getDefault().register(this);
    }

    private void initListener() {
        btn_send.setOnClickListener(this);
    }

    private void initViews() {
        btn_send = (Button) findViewById(R.id.btn_send);
        tv_content = (TextView) findViewById(R.id.tv_content);
    }

    //EventBus默认的接收事件处理的方法
    public void onEvent(MyEvent myEvent) {
        if (myEvent.getType().equals("0")) {
            tv_content.setText(myEvent.getContent());
        }
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_send: {
                //点击操作就是发送数据事件
                //自定义事件类
                MyEvent myEvent = new MyEvent();
                myEvent.setType("0");
                myEvent.setContent("待传递的数据111");
                EventBus.getDefault().post(myEvent);
            }
            break;
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //取消EventBus注册
        EventBus.getDefault().unregister(this);
    }
}
自定义事件类

package com.lantu.tuhuadmin.eventbus;

/**
 * Created on 2016/7/13.
 * Author:chenrushui
 * Description:XXX
 */
public class MyEvent {
    private String type;
    private String content;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

Event Bus基本用法

分订阅、注册、发布、取消订阅;主体都是谁?

注册:EventBus提供了三个构造方法

EventBus.getDefault().register(this);

EventBus.getDefault().register(new MyClass());

三个参数分别为:消息订阅者(接收者),接收方法名,事件类(里面可以定义要传递的属性)

EventBus.getDefault().register(this,”setTextA”, TextA.CLASS);

 

取消注册: 一般都是在ondestory()方法里面进行取消注册,释放资源!取消注册,只需要传递消息订阅者就可以了。

EventBus.getDefault().unregister(this);

EventBus.getDefault().unregister(new MyClass());

 

EventBus订阅处理数据:

EventBus支持四种模式,主线程的数据处理,交互式线程,后台线程和异步线程。

onEventMainThread(),  onEvent(),  onEventBackgroundThread()

 

发布:支持直接发布以及支持发布滞留消息

EventBus.getDefault().post(对象)

事件总线分发流程:


描述了发布者和订阅者的关系。即:一个发布者 发布事件到总线,总线分发给订阅者。

观察者模式

按钮触发监听事件—->EventBus发送消息—->EventBus接收消息—->处理接收到的消息。

安卓平台上一个用于Activity,FragmentThreadService被优化简化的通讯协议。少代码,高质量

它自定义事件类的功能特别强大, 有了这样定制消息的功能,我们就可以个性化消息,来对消息进行分类。

在EventBus中的观察者通常有四种订阅函数(就是某件事情发生被调用的方法)
1、onEvent()
2、onEventMainThread()
3、onEventBackground()
4、onEventAsync()

该方法将会在同一个线程来调用,避免了线程之间的切换,比如你是在主线程发送的消息,那么将会运行在主线程,如果为其他线程,那么将在其他线程调用。

// 在相同线程里调用 (默认)

    public void onEvent(MessageEvent event) {

        log(event.message);

}

 

将会在主线程调用,如果本身就在主线程,将直接调用

// 在主线程(UI线程)调用

    public void onEventMainThread(MessageEvent event) {

        //进行UI操作

        textField.setText(event.message);

}

// 在后台线程调用

   public void onEventBackgroundThread(MessageEvent event){

       //进行耗时操作

       saveToDisk(event.message);

   }


 观察者模式:
1、定义一个事件,这个事件一旦被EventBus分发出去就是代表某一件事情发生了,这个事件就是某个观察者关心的事情(不需要继承任何类)
2、定义观察者,然后将该观察者注册到EventBus
3、由EventBus分发事件,告知观察者某一件事情发生了.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值