首页 新闻 会员 周边 捐助

RxJava发布订阅者关系问题?

0
悬赏园豆:30 [待解决问题]

先看代码

implementation "io.reactivex.rxjava2:rxjava:2.2.3"
static class Event
    {
        private String msg;
        private long time; 
        Event(String msg)
        {
            this.msg = msg;
            time = System.currentTimeMillis();
        }  
        public String toString()
        {
            return msg;
        }
    }

    public static void main(String[] args) throws Exception
    {
        Observable<Event> sb = Observable.create(emitter -> {
            for (int i = 0; i < 100; i++)
            {
                Event msg = new Event("事件" + i);
                System.out.println("推送 :" + msg);
                emitter.onNext(msg);
                Thread.sleep(300);
            }
        });
        ConnectableObservable<Event> ob = sb.subscribeOn(Schedulers.newThread()).publish();
        ob.subscribe(s -> {
            Thread.sleep(2000);
            printEvent("打印机1号", s);
        });
        ob.subscribe(s -> {
            printEvent("打印机2号", s);
        });
        ob.connect(); 
        new Scanner(System.in).nextLine();
    }

    private static void printEvent(String tag, Event evt)
    {
        System.out.println(tag + " :" + evt + " ,延迟:" + (System.currentTimeMillis() - evt.time) + "ms");
    }

这是简单的一个发布者,多个订阅者的示例。运行结果是这样的:

推送 :事件0
打印机1号 :事件0 ,延迟:2001ms
打印机2号 :事件0 ,延迟:2001ms
推送 :事件1
打印机1号 :事件1 ,延迟:2000ms
打印机2号 :事件1 ,延迟:2000ms
推送 :事件2
打印机1号 :事件2 ,延迟:2000ms
打印机2号 :事件2 ,延迟:2000ms

按我理解应该多个订阅者之间是不互相影响的,但输出结果很明显打印2号竟然受1号影响?

我期待的输出结果应该是这样的:

推送 :事件0
打印机2号 :事件0 ,延迟:1ms
推送 :事件1
打印机2号 :事件1 ,延迟:0ms
推送 :事件2
打印机2号 :事件2 ,延迟:0ms
推送 :事件3
打印机2号 :事件3 ,延迟:0ms
推送 :事件4
打印机2号 :事件4 ,延迟:0ms
推送 :事件5
打印机2号 :事件5 ,延迟:0ms
推送 :事件6
打印机2号 :事件6 ,延迟:0ms
打印机1号 :事件0 ,延迟:2000ms
推送 :事件7
打印机2号 :事件7 ,延迟:0ms
推送 :事件8
打印机2号 :事件8 ,延迟:0ms
推送 :事件9
打印机2号 :事件9 ,延迟:0ms

那么订阅者应该受其他订阅的影响吗?如果输出我期待的结果(订阅者独立)应该代码怎么修改?

我想嘿嘿的主页 我想嘿嘿 | 初学一级 | 园豆:172
提问于:2018-11-11 12:48
< >
分享
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册