RxView.clicks订阅无响应:RxJava/RxAndroid新手求助
问题分析与解决
嘿,我一眼就揪出问题所在啦!你的代码里最致命的错误就在onSubscribe方法里:
@Override public void onSubscribe(Disposable d) { d.dispose(); // 这里直接取消了订阅关系! }
dispose()的作用是立即终止Observable和Observer之间的订阅连接,你刚建立订阅就把它掐断了,后续Observable.range(1,10)发出的所有onNext事件根本传不到Observer里,Toast自然就弹不出来咯。
修正方案
你需要移除onSubscribe里的d.dispose()调用,如果要避免内存泄漏,建议用CompositeDisposable来统一管理订阅关系,在合适的时机(比如Activity销毁时)再取消订阅:
修正后的完整代码示例
// 在Activity类中声明CompositeDisposable,用来统一管理订阅 private CompositeDisposable compositeDisposable = new CompositeDisposable(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); Disposable disposable = RxView.clicks(btn_range) .switchMap(new Function<Object, Observable<Integer>>() { @Override public Observable<Integer> apply(Object o) throws Exception { return Observable.range(1, 10); } }) .subscribe(new Observer<Integer>() { @Override public void onSubscribe(Disposable d) { // 将Disposable加入管理容器,不要直接调用dispose compositeDisposable.add(d); } @Override public void onNext(Integer integer) { Toast.makeText(MainActivity.this, integer + "", Toast.LENGTH_SHORT).show(); } @Override public void onError(Throwable e) { Toast.makeText(MainActivity.this, e.getMessage() + "", Toast.LENGTH_SHORT).show(); } @Override public void onComplete() { Toast.makeText(MainActivity.this, "1-10的序列发送完成啦", Toast.LENGTH_SHORT).show(); } }); } // 在Activity销毁时统一取消所有订阅,防止内存泄漏 @Override protected void onDestroy() { super.onDestroy(); compositeDisposable.dispose(); }
额外小优化
如果你的项目支持Java 8+,可以用Lambda表达式简化代码,可读性会更高:
RxView.clicks(btn_range) .switchMap(o -> Observable.range(1, 10)) .subscribe( integer -> Toast.makeText(MainActivity.this, integer + "", Toast.LENGTH_SHORT).show(), e -> Toast.makeText(MainActivity.this, e.getMessage() + "", Toast.LENGTH_SHORT).show(), () -> Toast.makeText(MainActivity.this, "序列发送完成", Toast.LENGTH_SHORT).show() );
另外要确保你的项目已经正确引入了RxJava、RxAndroid和RxBinding的依赖,版本兼容也很重要哦。
内容的提问来源于stack exchange,提问作者Cyrus the Great
相关产品推荐
相关产品推荐

