Как подписаться и отписаться или отменить наблюдаемую rxjava - PullRequest
0 голосов
/ 06 сентября 2018

Я новичок в RxJava и пытаюсь обновить работу asyncTask до RxJava. В качестве первой попытки я сделал следующие коды:

    public class MainActivity extends AppCompatActivity 
    {
        @Override
        protected void onCreate(Bundle savedInstanceState) 
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            doSomeWork();
        }


        private String funcCallServerGet()
        {
            //Some code to call a HttpClient Get method & return a response string
            //this is the method which previously i used to call inside asynctask doInbackground method
        }


          private void doSomeWork() {
               getSingleObservable()
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(getSingleObserver())    ;
        }


        private Single<String> getSingleObservable() 
        {
            return Single.create(new SingleOnSubscribe<String>() {
                @Override
                public void subscribe(SingleEmitter<String> emitter) throws Exception {
                    if(!emitter.isDisposed()) {
                        String strRxResponse =  funcCallServerGet();
                        emitter.onSuccess(strRxResponse);
                    }
                }
            });
        }


         private SingleObserver<String> getSingleObserver() 
        {

            return new SingleObserver<String>() {
                @Override
                public void onSubscribe(Disposable d) {
                    Log.d(TAG, " onSubscribe getSingleObserver: " + d.isDisposed());             }

                @Override
                public void onSuccess(String value) {
                    Log.d(TAG, " onNext : value : " + value);          }

                @Override
                public void onError(Throwable e) {
                    Log.d(TAG, " onError : " + e.getMessage());         }
            };
        }

    }

Но у меня есть некоторые заблуждения:

  1. Почему я получаю false в onSubscribe () из SingleObserver getSingleObserver () .

  2. Как отписаться или отменить наблюдение / наблюдателя при вызове операций onStop ().

  3. Кроме того, что на самом деле происходит при ориентации экрана. Наблюдаемое автоматически отписывается или продолжает свою работу? что делать для вращения устройства?

1 Ответ

0 голосов
/ 07 сентября 2018

Почему я получаю ложь в onSubscribe () SingleObserver getSingleObserver ().

В настоящее время вы регистрируете, утилизируется ли одноразовый метод в методе onSubscribe. На данный момент одноразовые еще не были утилизированы.

Как отписаться или отменить наблюдение / наблюдателя при вызове операций onStop ().

Вместо использования SingleObserver вы можете использовать метод подписки, который возвращает одноразовое значение. При этом вы можете либо управлять одноразовым расходом напрямую, либо использовать CompositeDisposable. Затем вы должны вызвать метод dispose для этого одноразового использования, с CompositeDisposable это достигается путем вызова clear ()

private final CompositeDisposable disposables = new CompositeDisposable();

@Override
protected void onStart() {
    super.onStart();
    disposables.add(getSingleObservable()
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(value -> {
                Log.d(TAG, " onSuccess: " + value);
            }, error -> {
                Log.e(TAG, " onError", error);
            }
        )
    );
}

@Override
protected void onStop() {
    disposables.clear();
    super.onStop();
}

Кроме того, что на самом деле происходит при ориентации экрана. Наблюдаемое автоматически отписывается или продолжает свою работу? что делать для ротации устройства?

По умолчанию автоматическое управление наблюдаемым не происходит, вы сами управляете им. В вашем примере кода, когда устройство вращается, вы получите еще один вызов onCreate, здесь вы запланируете работу, которая будет выполнена снова, работа, которая была запланирована до ротации, все еще могла быть запущена, так что вы могли в итоге утечь старую активность и получить обратный вызов, когда работа завершается успешно или не удается - в этом случае вы увидите оператор журнала.

Существуют некоторые инструменты, которые обеспечивают автоматическое наблюдаемое управление, хотя вам следует прочитать статью авторов о некоторых проблемах, которые существуют при таком подходе.

Другим вариантом для вас может быть просмотр новой библиотеки компонентов архитектуры, в частности ViewModel и LiveData. Это упростит то, что вам нужно сделать в отношении управления подписками и изменениями конфигурации.

...