订阅可观察的内容

时间:2019-07-02 05:38:37

标签: java observable rx-java2

我试图了解Observable的执行方式,但似乎无法使这个简单的代码正常工作。

1

public class RxJavaExample { public static void main(String[] args) { Observable<String> hello = Observable.fromCallable(() -> getHello()).subscribeOn(Schedulers.newThread()); hello.subscribe(); System.out.println("End of main!"); } public static String getHello() { System.out.println("Hello called in " + Thread.currentThread().getName()); return "Hello"; } } 是否应该执行hello.subscribe()

3 个答案:

答案 0 :(得分:2)

这是因为您的主线程在后台线程到达getHello之前完成了。退出前,请尝试在Thread.sleep(5000)方法中添加main

或者,等到您的订阅的onCompleted被调用。

编辑:程序终止的原因是因为RxJava产生了daemon个线程。在寻找良好资源的过程中,我还发现了this个问题,也可能回答了这个问题。

答案 1 :(得分:0)

@sfiss是正确的,它的工作与您期望的一样:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

import io.reactivex.Observable;
import io.reactivex.schedulers.Schedulers;

public class RxJavaExample {
  public static void main(String[] args) throws InterruptedException {
    ExecutorService exec = Executors.newCachedThreadPool();
    Observable<String> hello = Observable.fromCallable(() -> getHello())
        .subscribeOn(Schedulers.from(exec));

    hello.subscribe();

    System.out.println("End of main!");

    exec.shutdown();
    exec.awaitTermination(10, TimeUnit.SECONDS);
  }

  public static String getHello() {
    System.out.println("Hello called in " + Thread.currentThread().getName());
    return "Hello";
  }
}

具有以下输出:

End of main!
Hello called in pool-1-thread-1

答案 2 :(得分:-1)

可能是您对Thread和Observables感到困惑,

我过去使用Observables的方式是在Minecraft插件上使用计时器,我有一个每分钟触发一次的事件。

public class TimerHandler extends Observable implements Runnable{

    @Override
    public void run() {
        this.setChanged();
        this.notifyObservers();
    }
}

因此这会每分钟触发一次,然后将事件添加到计时器队列中,您只需订阅可观察到的含义,即每分钟都会触发订阅的呼叫。

public class PlotTimer implements Observer {

    @Override
    public void update(Observable o, Object arg) {
        ......

要订阅,我会拨打以下电话

getServer().getScheduler().scheduleAsyncRepeatingTask(this,timerHandler,1200,1200);
timerHandler.addObserver(new PayDayTimer());
timerHandler.addObserver(new ProfileTimer());
timerHandler.addObserver(new PlotTimer());