Одноразовый объект является нулевым после подписки - PullRequest
0 голосов
/ 22 декабря 2018

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

Для SingleObserver обратных вызовов, несмотря на получение значений в onSuccess(), объект Disposable в onSubscribe()всегда null.

Я также разместил logcat.Пожалуйста, посмотрите на это, и, пожалуйста, дайте мне знать, почему Disposable объект d является null.

код :

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 SingleObserver<HandlerThread> getSingleObserver() {
    String TAG_LOG = ActMain.TAG_LOG + "." + "getSingleObserver()";
    return new SingleObserver<HandlerThread>() {
        @Override
        public void onSubscribe(Disposable d) {
            Log.v(TAG_LOG, "[onSubscribe] d: " + d);
        }

        @Override
        public void onSuccess(HandlerThread is) {
            Log.v(TAG_LOG, "[onSuccess] is: " + is);
        }

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

logcat :

2018-12-22 14:56:50.329 12611-12611 V/ActMain: onStart
2018-12-22 14:56:50.332 12611-12611 V/ActMain.MyHandlerThread: constructor called
2018-12-22 14:56:50.333 12611-12611 V/ActMain.getSingleObserver(): [onSubscribe] d: null//<--------------------
2018-12-22 14:56:50.349 12611-12611 D/ActMain.onResume(): BEFORE .start()
2018-12-22 14:56:50.349 12611-12611 D/ActMain.onResume(): AFTER .start()
2018-12-22 14:56:50.350 12611-12630 V/ActMain.MyHandlerThread.onLooperPrepared: ..
2018-12-22 14:56:50.350 12611-12630 D/ActMain.MyHandlerThread.onLooperPrepared: this.getLooper(): Looper (my HandlerThread, tid 416) {2f35ee2}
2018-12-22 14:56:50.363 12611-12630 I/ActMain.MyHandlerThread.onLooperPrepared: [onSubscribe] d: null
2018-12-22 14:56:50.377 12611-12633 D/ActMain.MyHandlerThread.onLooperPrepared.emitter.onComplete():: this.getLooper() initialized: Looper (my HandlerThread, tid 416) {2f35ee2}
2018-12-22 14:56:50.377 12611-12633 I/ActMain.MyHandlerThread.onLooperPrepared: [onComplete]
2018-12-22 14:56:50.425 12611-12611 V/ActMain.getSingleObserver(): [onSuccess] is: Thread[my HandlerThread,5,main]
2018-12-22 14:56:50.514 1700-1724 I/ActivityManager: Displayed com.example.amrbakri.rxhandlerthread_01/.ActMain: +340ms

1 Ответ

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

Оказывается, это интересный вопрос.Из документов для RxJava2 ( Single )

Single ведет себя аналогично Observable, за исключением того, что может выдавать только одно успешное значение или ошибку (тамне является уведомлением "onComplete", как для Observable).

Класс Single реализует базовый интерфейс SingleSource, а тип потребителя по умолчанию, с которым он взаимодействует, - это SingleObserver с помощью метода подписки (SingleObserver).

Похоже, что вы используете SingleObserver, а не DisposableSingleObserver.

В документах упоминается, что:

Обратите внимание, что по конструкции подписки через подписку (SingleObserver) не могут быть утилизированы извне (отсюда и недействительный возврат метода подписки (SingleObserver)) , и разработчик SingleObserver несет ответственность за то, чтобы это произошло.RxJava поддерживает такое использование со стандартным экземпляром DisposableSingleObserver.Для удобства также предоставляется метод subscribeWith (SingleObserver), позволяющий свободно работать с экземпляром SingleObserver (или подклассом) (например, в приведенном выше примере).

Поэтому попробуйте сделать это вместо:

Disposable d = Single.just("Hello World")
    .delay(10, TimeUnit.SECONDS, Schedulers.io())
    .subscribeWith(new DisposableSingleObserver<String>() {
        @Override
        public void onStart() {
            System.out.println("Started");
        }

        @Override
        public void onSuccess(String value) {
            System.out.println("Success: " + value);
        }

        @Override
        public void onError(Throwable error) {
            error.printStackTrace();
        }
    });
...