我是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()); }
};
}
}
但是我有些困惑:
为什么在 SingleObserver getSingleObserver()的 onSubscribe()中出现 false 的问题。
调用活动onStop()时如何取消订阅或取消可观察者/观察者。
此外,屏幕调整时会发生什么。可观察对象是否会自动退订或继续工作?设备旋转该怎么做?
答案 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。这将简化您在订阅管理和配置更改方面需要做的事情。