问题描述
1 . 先上我写的一个方法:
public static Observable<RxEvent> sendBytesRx(ByteBuffer buffer) {writeThread.add(buffer);return RxBus.getDefault().toObserverable(RxEvent.class);}
这是一个发送数据到服务器的一个函数。
2 . 然后我就调用:
@OnClick(R.id.button2) public void btn2(Button button) {BgService.sendBytesRx(CSAPIUtils._1_LogIn(xxx,xxx)).observeOn(Schedulers.newThread()).compose(this.bindUntilEvent(ActivityEvent.DESTROY)).subscribeOn(Schedulers.newThread()).subscribe(rxEvent -> { //解析数据 LogUtils.e(OpenLog,TAG,'1');},throwable -> { LogUtils.e(OpenLog,TAG,throwable.getMessage());}); }
3 . 发现有点不对,当我多次点击这个Button,触发OnClick方法,发现,第一次点击,返回数据,打印:1第二次点击,返回数据,打印:1 1 ...好像是每次点击的时候,就订阅了这个RxBus的事件,但是事件完成之后却没有去取消订阅...
请教各位大神!刚入Rx大门。
问题解答
回答1:多次订阅,每个订阅者都会收到消息。解决方法:只在onCreate时订阅一次,或者订阅收到消息后取消当前订阅
回答2:第2段代码应该没有什么大问题, 除了Schedulers的指定. 主要问题出在第1段, 且看下第1段代码:
public static Observable<RxEvent> sendBytesRx(ByteBuffer buffer) {writeThread.add(buffer);return RxBus.getDefault().toObserverable(RxEvent.class);}
RxBus.getDefault().toObserverable(RxEvent.class) 应该就是问题所在, 得看具体实现代码.
p.s. 和订阅时机没有关系. 如果有, 那就是自身代码逻辑的问题, Rx订阅是随时都可以的.