如何订阅和取消订阅或取消可观察的rxjava

时间:2018-09-06 17:51:57

标签: android rx-java rx-java2

我是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. 为什么在 SingleObserver getSingleObserver() onSubscribe()中出现 false 的问题。

  2. 调用活动onStop()时如何取消订阅或取消可观察者/观察者。

  3. 此外,屏幕调整时会发生什么。可观察对象是否会自动退订或继续工作?设备旋转该怎么做?

1 个答案:

答案 0 :(得分:1)

  

为什么在SingleObserver的onSubscribe()getSingleObserver()中变得虚假。

您当前正在记录一次性用品是否放在onSubscribe方法内。目前,尚未处理一次性用品。

  

调用活动onStop()时如何取消订阅或取消可观察者/观察者。

除了使用SingleObserver之外,您还可以使用Subscribe方法,该方法返回一次性对象。这样,您既可以直接管理一次性用品,也可以使用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。这将简化您在订阅管理和配置更改方面需要做的事情。