首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

EventBus源码分析(5)

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:动态控制并发;
返回列表