Rx java 如何使用Observable.from(未来)?

Rx java 如何使用Observable.from(未来)?,rx-java,Rx Java,我正在Android上学习RxJava。我想把它用于网络,所以我不能在主线程上做任何事情 我有以下代码: 最终字符串RXTAG=“Rx”; Log.d(RXTAG,“启动Rx实验”); final FutureTask future=新的FutureTask(新的可调用(){ @凌驾 公共字符串调用()引发InterruptedException{ Log.d(RXTAG,“线程上可调用的”+thread.currentThread().getName()); Utils.assertNotUI

我正在Android上学习RxJava。我想把它用于网络,所以我不能在主线程上做任何事情

我有以下代码:

最终字符串RXTAG=“Rx”;
Log.d(RXTAG,“启动Rx实验”);
final FutureTask future=新的FutureTask(新的可调用(){
@凌驾
公共字符串调用()引发InterruptedException{
Log.d(RXTAG,“线程上可调用的”+thread.currentThread().getName());
Utils.assertNotUIThread();
Thread.sleep(TimeUnit.SECONDS.toMillis(1));//模拟网络延迟
回复“你好”;
}
});
可观察。来自(future,Schedulers.io())。超时(5,TimeUnit.SECONDS)。订阅(
新行动1(){
@凌驾
公共作废调用(最终字符串s){
Log.d(RXTAG,“下一个”+s);
}
},
新行动1(){
@凌驾
公开作废通知(最终可丢弃){
Log.w(RXTAG,可丢弃);
}
},
新操作0(){
@凌驾
公开作废通知(){
日志d(RXTAG,“已完成”);
}
}
);

但它在5秒后以
TimeoutException
结束,并且从未显示可调用的日志。出了什么问题,以及如何使其工作?

您必须自己运行
未来的
。但幸运的是,它导致在主线程上运行
可调用的
,或者您必须使用
执行器

相反,我提供了以下解决方案:

//从FutureTask提取可调用
Single.fromCallable(callable).timeout(5,TimeUnit.SECONDS).subscribeOn(Schedulers.io()).subscribe(
新行动1(){
@凌驾
公共作废调用(最终字符串s){
Log.d(RXTAG,“Success”+s);
}
},
新行动1(){
@凌驾
公开作废通知(最终可丢弃){
Log.w(RXTAG,可丢弃);
}
}
);
现在,它如预期的那样工作:

07-29 13:41:26.516 D/Rx: Starting Rx experiment
07-29 13:41:26.547 D/Rx: Callable called on thread RxIoScheduler-2
07-29 13:41:27.550 D/Rx: Success hello

在订阅之前尝试添加以下代码

.doOnSubscribe(disposable -> future.run())
.subscribeOn(Schedulers.io())
Rxjava2代码:

Observable.fromFuture(future, Schedulers.io())
.doOnSubscribe(disposable -> future.run())
.subscribeOn(Schedulers.io())
.subscribe(someConsumer()). 

运行良好。

也许您应该使用Vertx记录器'io.Vertx.core.logging.logger;'用于显示日志消息。这不是记录器问题。将显示初始日志,以及包含错误的日志。如果我使用
Observable.just()
,也会显示下一个日志。对不起,我对vertxTo初学者有错误,我建议他们熟悉
Observable
Single
中的可用方法,即使你刚刚读过他们的名字。大多数运算符的命名方式与用于表示所需功能的典型语言相匹配。