Mainthread заканчивается до вызова CompletabeObserver - PullRequest
0 голосов
/ 22 декабря 2018

В приведенном ниже коде я создал пример для изучения функционального программирования с использованием Rx.Я пытаюсь обработать HandlerThread как наблюдаемый.В onResume () я подписываюсь на Single.just, наблюдаемый для запуска HandlerThread.

Обратные вызовы SingleObserver вызываются правильно.Но для CompletableObserver в onLooperPrepared () он никогда не вызывается, несмотря на то, что вызывается Completable.complete ().

Я также разместил logcat.Пожалуйста, посмотрите на него, и, пожалуйста, дайте мне знать, почему я не получаю никаких журналов от CompletableObserver.

код :

onResume() {
    this.mMyHandlerThreadInitSingleObs = Single.just(this.getInitializedHandlerThread())
            .map(myHandlerThread->{
                Log.d(TAG_LOG, "BEFORE .start()");
                myHandlerThread.start();
                Log.d(TAG_LOG, "AFTER .start()");

                return this.mMyHandlerThread;
            });
    this.mMyHandlerThreadInitSingleObs
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(this.getSingleObserver());

}
private static class MyHandlerThread extends HandlerThread {
    private final static String TAG_LOG = ActMain.TAG_LOG + "." + MyHandlerThread.class.getSimpleName();
    private Handler mHandler = null;

    MyHandlerThread(String name) {
        super(name);
        Log.v(MyHandlerThread.TAG_LOG, "constructor called");
    }

    @Override
    protected void onLooperPrepared() {
        super.onLooperPrepared();
        String TAG_LOG = MyHandlerThread.TAG_LOG + "." + "onLooperPrepared";
        Log.d(TAG_LOG, "this.getLooper(): " + this.getLooper());

        Completable.create(emitter -> {
            if (this.getLooper() != null) {
                Log.d(TAG_LOG+"."+"Completable.create", "this.getLooper() initialized: " + this.getLooper());
                Completable.complete();
            } else {
                Log.e(TAG_LOG+"."+"Completable.create", "this.getLooper() is null: " + this.getLooper());
                Completable.error(new NullPointerException(THROW_NPE_ON_LOOPER_NULL));
            }
        })
        .subscribeOn(Schedulers.io())
        .observeOn(Schedulers.trampoline())
        .subscribe(new CompletableObserver() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.i(TAG_LOG, "[onSubscribe]");
            }

            @Override
            public void onComplete() {
                Log.i(TAG_LOG, "[onComplete]");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG_LOG, "[onError]: e.getMessage(): " + e.getMessage());
            }
        });
    }
}

private SingleObserver<MyHandlerThread> getSingleObserver() {
    String TAG_LOG = ActMain.TAG_LOG + "." + "getSingleObserver()";
    return new SingleObserver<MyHandlerThread>() {
        @Override
        public void onSubscribe(Disposable d) {
            Log.v(TAG_LOG, "[onSubscribe]");
        }

        @Override
        public void onSuccess(MyHandlerThread myHandlerThread) {
            Log.v(TAG_LOG, "[onSuccess]");
        }

        @Override
        public void onError(Throwable e) {
            Log.e(TAG_LOG, "[onError]");
        }
    };
}

logcat:

2018-12-22 12:40:12.118 V/ActMain: onStart
2018-12-22 12:40:12.120 V/ActMain.MyHandlerThread: constructor called
2018-12-22 12:40:12.125 V/ActMain.getSingleObserver(): [onSubscribe]
2018-12-22 12:40:12.129 D/ActMain.onResume(): BEFORE .start()
2018-12-22 12:40:12.129 D/ActMain.onResume(): AFTER .start()
2018-12-22 12:40:12.130 V/ActMain.MyHandlerThread.onLooperPrepared: ..
2018-12-22 12:40:12.130 01 D/ActMain.MyHandlerThread.onLooperPrepared: this.getLooper(): Looper (my HandlerThread, tid 352) {1353cc7}
2018-12-22 12:40:12.131 01 V/ActMain.MyHandlerThread.onLooperPrepared: [onSubscribe]
2018-12-22 12:40:12.132 D/ActMain.MyHandlerThread.onLooperPrepared.Completable.create: this.getLooper() initialized: Looper (my HandlerThread, tid 352) {1353cc7}
2018-12-22 12:40:12.139 V/ActMain.getSingleObserver(): [onSuccess]
2018-12-22 12:40:12.436 I/ActivityManager: Displayed com.example.amrbakri.rxhandlerthread_01/.ActMain: +552ms

1 Ответ

0 голосов
/ 22 декабря 2018

Во-первых, это Completable.complete ();не имеет смысла, потому что это статическая функция, которая возвращает Completable, если вы пытаетесь отправить поток в oncomplete, вам нужно вызвать onComplete () для emitter следующим образом.

    Completable.create(emitter -> {
        emitter.onComplete();
        System.out.println("1");
    }).subscribeOn(Schedulers.io())
            .observeOn(Schedulers.trampoline()).subscribe(new CompletableObserver() {
        @Override
        public void onSubscribe(Disposable d) {
            System.out.println("2");

        }

        @Override
        public void onComplete() {
            System.out.println("3");

        }

        @Override
        public void onError(Throwable e) {
            System.out.println("4");
        }
    });
}
...