Board logo

标题: EventBus源码分析(5) [打印本页]

作者: look_w    时间: 2019-4-12 17:02     标题: EventBus源码分析(5)

分析postSingleEvent:
1>首先:获取当前 Javabean 数据所在的 Class对象,根据 该 对象获取 List<Class<?>>,这个就是 Javabean 数据 当前 Class及父类和接口的Class类型,用于匹配;
2>然后:遍历onEventMainThread(参数)中参数的所有 Class,在 subscriptionsByEventType中 查找 subscriptions,register注册时就是把 所有方法都存储到 subscriptionsByEventType集合中;
3>然后:然后 遍历每个 subscription,依次调用 postToSubscription,这个就是反射执行的方法,register时的 if(sticky) 就执行这个方法

    private void postToSubscription(Subscription subscription, Object event, boolean isMainThread) {
            switch (subscription.subscriberMethod.threadMode) {
            case PostThread:
                invokeSubscriber(subscription, event);
                break;
            case MainThread:
                if (isMainThread) {
                    invokeSubscriber(subscription, event);
                } else {
                    mainThreadPoster.enqueue(subscription, event);
                }
                break;
            case BackgroundThread:
                if (isMainThread) {
                    backgroundPoster.enqueue(subscription, event);
                } else {
                    invokeSubscriber(subscription, event);
                }
                break;
            case Async:
                asyncPoster.enqueue(subscription, event);
                break;
            default:
                throw new IllegalStateException("Unknown thread mode: " + subscription.subscriberMethod.threadMode);
            }
        }

根据threadMode判断,应该在哪个线程调用 反射方法
case PostThread:在当前线程,调用反射;
case MainThread:如果是主线程,则调用反射,否则用 handler发送消息,然后执行;
case BackgroundThread:如果是主线程,将任务加入到后台队列中,然后由EventBus中的一个线程池调用,如果是子线程,则直接调用反射;
case Async:与BackgroundThread一样,把任务加入到后台队列中,由EventBus中的一个线程池调用;且二者是同一个线程池;
BackgroundThread 与 Async区别:
BackgroundThread :它里边的任务一个接一个调用,中间用 boolean类型变量 handlerActive控制;
Async:动态控制并发;




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0