Расписание Rxjava не будет запускаться после последней строки

Я новичок в RX и не знаю, как работают планировщики. ниже приведен код, который никогда не запускает onComplete . но если я поставлю цикл while(true) в конце, он будет работать правильно. похоже, что приложение закроется до запуска new thread.

почему это происходит? и как исправить эту проблему?

Subscriber<String> subscriber = new Subscriber<String>() {
        @Override
        public void onCompleted() {
            System.out.println("done");
        }

        @Override
        public void onError(Throwable throwable) {

        }

        @Override
        public void onNext(String o) {
            System.out.println(o);
        }
    };

    Observable.from(new String[]{"1", "2", "3","4"}).
            subscribeOn(Schedulers.immediate())
            .observeOn(Schedulers.newThread())
            .subscribe(subscriber);

person Community    schedule 02.01.2016    source источник


Ответы (1)


Просто добавьте Thread.sleep(1000); в качестве последнего оператора, если ваша программа завершается слишком рано.

Что касается почему это происходит.

Этот ответ цитирует:

Виртуальная машина Java продолжает выполнять потоки до тех пор, пока не произойдет одно из следующих событий:

...

Все потоки, не являющиеся потоками демона, умерли...

Теперь, если мы посмотрим на RxThreadFactory, который создает потоки для Schedulers:

public final class RxThreadFactory extends AtomicLong implements ThreadFactory {
    
    ...

    @Override
    public Thread newThread(Runnable r) {
        Thread t = new Thread(r, prefix + incrementAndGet());
        t.setDaemon(true);
        return t;
    }
}

Таким образом, более сложным решением будет использование Schedulers.from() и передача пользовательского Executor с вашим собственным ThreadFactory, который создает потоки, не являющиеся демонами.

person AndroidEx    schedule 02.01.2016
comment
Благодарность! но не ищу просто работающее решение. ищет правильный путь. что, если newThread займет 5 секунд? - person ; 02.01.2016
comment
@sajad Я немного расширил свой ответ - person AndroidEx; 02.01.2016