EventBus 消息通信机制在项目开发中的使用

xiaoxiao2021-02-28  44

实现组件之间的消息通信有很多种方式,比如,利用Handle 实现消息的异步通信;这个后面一章会讲到,今天主要总结一下EventBus 在实际项目中的应用;通过消息的发布和订阅模式实现不同组件之前的通信机制;

在开始使用EventBus 之前,先来了解一下EventBus 相关的四个订阅函数: 1、onEvent 2、onEventMainThread 3、onEventBackgroundThread 4、onEventAsync

1 onEvent 2.onEventMainThread 3.onEventBackgroundThread 4. onEventAsync

**onEvent:如果使用onEvent作为订阅函数,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。使用这个方法时,在onEvent方法中不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟。 onEventMainThread:如果使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行,这个在Android中是非常有用的,因为在Android中只能在UI线程中跟新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。 onEventBackground:如果使用onEventBackgrond作为订阅函数,那么如果事件是在UI线程中发布出来的,那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么onEventBackground函数直接在该子线程中执行。 onEventAsync:使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync.** EventBus 可以实现在不同Activity,fragment 之前实现通信;发送消息,接受消息,通常我们再更新UI 界面,处理页面显示时会用到。 使用方法: 先创建BaseEventMessage 类

package com.xinsheng.kuaijiexiaodai.ui.base; import android.support.annotation.NonNull; /** * Created by:andy * ClassName:BaseEventMessage * Date:2018/1/4 17:16 * Description: EventBus 消息通信 */ public class BaseEventMessage<T> { public String type; public T data; public BaseEventMessage(@NonNull String type, T data) { this.type = type; this.data = data; } }

要在哪个界面使用,就要先在这个界面里注册监听;for example:在Activity 中使用;

注册:onCreate()生命周期里注册监听,

EventBus.getDefault().register(this);

注销监听:

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

消息发送方:

EventBus.getDefault().post(new BaseEventMessage<String>("authFlag", "success"));

监听消息:

在需要接受消息的页面也同样进行注册,注销操作; 此处需要注意的是:消息的type 和data 一致时才能接收到消息,否则无法实现通信.BaseEventMessage<> 本身就是一个泛型;type 为消息类型,,type 可以为String ,Int, double ,对象类型等等。data 为 传递过来的数据; 注意:

注意:在实际项目开发中我们经常会在同一个界面里,接受和处理来自多个界面的消息,此时,我们通常是在post 消息的时候,通过消息的type 加以区别; 然后在接收监听消息的界面中,对消息类型分别判断即可;

@Subscribe(threadMode = ThreadMode.MAIN) public void onEventMainThread(BaseEventMessage<String> message) { LogUtil.i("BaseEventMessage"+message.data); if (message.type.equals("authFlag")) { // 开始执行相应的操作,比如说请求网络,更新UI,等等..... getAuthenticationInfo(); } }
转载请注明原文地址: https://www.6miu.com/read-2626012.html

最新回复(0)