android - 关于RxBus的一个疑问...
迷茫
迷茫 2017-04-17 18:01:22
[Android讨论组]

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大门。

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(2)
PHP中文网

多次订阅,每个订阅者都会收到消息。
解决方法:只在onCreate时订阅一次,或者订阅收到消息后取消当前订阅

阿神

第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订阅是随时都可以的.

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号