Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将API回调绑定到RxJava可观察对象_Java_System.reactive_Rx Java_Observable - Fatal编程技术网

将API回调绑定到RxJava可观察对象

将API回调绑定到RxJava可观察对象,java,system.reactive,rx-java,observable,Java,System.reactive,Rx Java,Observable,我正在尝试制作一个反应式应用程序,它在一个单独的线程上侦听网络套接字以获取价格,但对于如何准确地构造可观察的,我有点困惑。我拥有的许多接口都受到我正在使用的API的限制,因此无法更改。作为下面的测试,我提取了我试图做的事情,但我看不到如何填写getPriceReactive()方法的主体,以便订阅者在控制台上打印价格(请参见代码中的注释) priceobservetest公共类{ //此接口由API外部定义和使用 专用接口ITickHandler{ 收到无效价格(双倍价格); } //存储价格(

我正在尝试制作一个反应式应用程序,它在一个单独的线程上侦听网络套接字以获取价格,但对于如何准确地构造可观察的
,我有点困惑。我拥有的许多接口都受到我正在使用的API的限制,因此无法更改。作为下面的测试,我提取了我试图做的事情,但我看不到如何填写
getPriceReactive()
方法的主体,以便订阅者在控制台上打印价格(请参见代码中的注释)

priceobservetest公共类{
//此接口由API外部定义和使用
专用接口ITickHandler{
收到无效价格(双倍价格);
}
//存储价格(目前仅一倍用于说明)
私人类蜱虫{
双倍价格=double.NaN;
}
//API在收到价格时调用的处理程序的实现
私有类TickHandler实现ITickHandler{
私人最后滴答声;
TickHandler(){this.tick=new tick();}
@覆盖已接收的公共无效价格(双x){tick.price=x;}
}
//此类模拟从套接字传递价格的API
私有类价格源{
专用终螺纹;
PriceSource(最终ITickHandler处理程序){
线程=新线程(新可运行(){
最终随机r=新随机();
@重写公共无效运行(){
而(!Thread.currentThread().isInterrupted()){
试一试{
睡眠(100);
handler.priceReceived(r.nextDouble()*100);
}捕捉(中断异常e){
打破
}
}
System.out.println(“价格线程关闭”);
}
});
}
void subscribe(){thread.start();}
void unsubscribe(){thread.interrupt();}
}
@试验
public void simpleTest()引发异常{
最终ITickHandler=新的TickHandler();
//模拟从套接字定期收到的一些价格
PriceSource价格=新的PriceSource(处理程序);
可观察的反应性=GetPrice反应性(处理程序);
reactive.subscribe(新订户(){
@重写已完成()的公共void{}
@重写公共无效onError(可丢弃的e){}
@覆盖公共void onNext(勾选){
系统输出打印项次(“收到价格:+勾选价格”);
}});
//观察价格1秒。订阅者应将其打印到控制台
价格。订阅();
睡眠(1000);
价格。取消订阅();
}
//返回对价格变化作出反应的可观察值
私有可观察getPriceResponsive(ITickHandler){
返回Observable.create(newobservable.OnSubscribe(){

@在
ITickHandler
实现中覆盖公共无效呼叫(订阅者转换到
可观察的
。您不是在控制订阅者,而是在控制发布者

private class TickHandler implements ITickHandler {
   private final Tick tick;
   private final PublishSubject<Tick> priceSubject;

  TickHandler() { 
       this.tick = new Tick(); 
       this.priceSubject = PublishSubject.create();
   }

   @Override public void priceReceived(double x)
   { 
        tick.price = x; 
        priceSubject.onNext(tick);
   }

   public Observable<Tick> priceReceivedObservable()
   {
       return priceSubject.asObservable();   
   }
}
私有类TickHandler实现ITickHandler{
私人最后滴答声;
私人最终出版主体价格主体;
TickHandler(){
this.tick=新的tick();
this.priceSubject=PublishSubject.create();
}
@覆盖已接收的公共无效价格(双x)
{ 
tick.price=x;
priceSubject.onNext(勾选);
}
公共可观测价格可接收可服务()
{
返回priceSubject.asObservable();
}
}
您可以在测试中使用它,如:

final ITickHandler handler = new TickHandler();
PriceSource prices = new PriceSource(handler);

handler.priceReceivedObservable()
       .subscribe(new Subscriber<Tick>() {
          @Override public void onCompleted() { }
          @Override public void onError(Throwable e) { }
          @Override public void onNext(Tick tick) {
              System.out.println("Received price: " + tick.price);
          }});
final ITickHandler=new TickHandler();
PriceSource价格=新的PriceSource(处理程序);
handler.priceReceivedObservable()
.subscribe(新订户(){
@重写已完成()的公共void{}
@重写公共无效onError(可丢弃的e){}
@覆盖公共void onNext(勾选){
系统输出打印项次(“收到价格:+勾选价格”);
}});

我警告您,它没有经过测试,因为我不太会使用Java:)

主题的使用很有趣,但我对它们有点怀疑,因为rx文档似乎建议只有在极少数情况下才需要它们。事实上,已经有人提出了一个非常类似的问题,解决方案不涉及主题:@scarletpumpernice我不会说这个问题或任何答案与您的问题相关(除非你想用自定义事件污染你的代码)。我还想说,这是
主题的一个适当用例
我将+1主题的使用-每当你想用外部事件驱动一个可观察对象时,它们都是优秀的,可能不完全在你的控制之下。可观察的。create()也可以,但会有点麻烦,您需要处理(或防止)多个订阅。@TassosBassoukos即使是
可观察的。Create
您必须使用
主题
或事件将API调用传输到
可观察的
,对吗?不一定-当Create()中的回调运行时,您可以访问订阅者;您可以在此时手动驱动它。
final ITickHandler handler = new TickHandler();
PriceSource prices = new PriceSource(handler);

handler.priceReceivedObservable()
       .subscribe(new Subscriber<Tick>() {
          @Override public void onCompleted() { }
          @Override public void onError(Throwable e) { }
          @Override public void onNext(Tick tick) {
              System.out.println("Received price: " + tick.price);
          }});