EventBus的一些分析
Posted 清浅岁月
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EventBus的一些分析相关的知识,希望对你有一定的参考价值。
EventBus
使用
implementation 'org.greenrobot:eventbus:3.1.1'
在接收消息的地方注册该类:
EventBus.getDefault().register(this);
定义发送事件的类:相当于要发送的消息内容
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventLoginBindState(final LoginBindStateEvent event)
BaseLog.d(TAG, "Login state : event 1 = " + event.mResultMsg);
if (event.mEvent == LoginBindStateEvent.EVENT_BINDACCOUNT)
if (event.isSuccessful())
BaseLog.i("LOGIN", "收到关闭激活页面的通知");
if (mLoginStateListener != null)
mLoginStateListener.onLoginSuccess(MainLoginFragment.this);
else
BaseLog.i("LOGIN", "收到绑定节点发送账号绑定异常展示");
showErrorTip(event.mResultMsg);
@ Subscribe是定义的注解,java的标准注解:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Subscribe
ThreadMode threadMode() default ThreadMode.POSTING;
boolean sticky() default false;
int priority() default 0;
需要指定threadMode,线程类型,sticky 是否粘滞时间,priority优先级,当出现多个注册发送消息要制定优先级。
ThreadMode有五钟模式:
POSTING:
订阅者将在发布事件的同一线程中调用。这是默认值。事件传递是同步完成的,一旦发布完成,所有订阅者都将被调用。此ThreadMode意味着开销最小,因为它完全避免了线程切换。因此,对于已知完成的简单任务,这是一个推荐的模式,非常短的时间而不需要主线程
MAIN:
订阅者将在android的主线程(有时称为UI线程)中调用。如果发布线程是主线程,则将直接调用事件处理程序方法(与ThreadMode.POSTING所描述的同步)。使用此模式的事件处理程序必须快速返回以避免阻塞主线程。
MAIN_ORDERED:
订阅者将在Android的主线程中调用。该事件总是排队等待以后发送给订阅者,因此对post的调用将立即返回。这使事件处理更加严格且更加一致(因此名称为MAIN_ORDERED)。例如,如果您在具有MAIN线程模式的事件处理程序中发布另一个事件,则第二个事件处理程序将在第一个事件处理程序之前完成(因为它被同步调用 - 将其与方法调用进行比较)。使用MAIN_ORDERED,第一个事件处理程序将完成,然后第二个事件处理程序将在稍后的时间点调用(一旦主线程具有容量)。
BACKGROUND:
订阅者将在后台线程中调用。如果发布线程不是主线程,则将在发布线程中直接调用事件处理程序方法。如果发布线程是主线程,则EventBus使用单个后台线程,该线程将按顺序传递其所有事件。
ASYNC:
事件处理程序方法在单独的线程中调用。这始终独立于发布线程和主线程。发布事件永远不会等待使用此模式的事件处理程序方法。如果事件处理程序的执行可能需要一些时间,例如用于网络访问,则应使用此模式。避免同时触发大量长时间运行的异步处理程序方法来限制并发线程数。EventBus使用线程池从已完成的异步事件处理程序通知中有效地重用线程。
总结一下:
POSTING :事件发送和接受方在一个线程,不涉及跨线程
MAIN:事件接收方在主线程,时间发送方在主线程,不涉及跨线程,事件发送方在其他线程将涉及跨线程。
MAIN_ORDERED:在主线程接收到多个消息,在第一个处理完,在处理第二个事件。
ASYNC:事件接受和发布在不同的线程,
以上是关于EventBus的一些分析的主要内容,如果未能解决你的问题,请参考以下文章