Графикът на 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