【发布时间】:2017-12-12 01:18:04
【问题描述】:
我尝试将下面的AsyncTask 代码转换为Rxjava2,但显然Rxjava2 不处理空值,因此我的应用程序崩溃了。这是我的AsyncTask 代码:
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
Set<Map.Entry<String, Participant>> entries = pool.entrySet();
for (Map.Entry<String, Participant> entry : entries) {
Participant participant = entry.getValue();
participant.release();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
cb.event(new Spin.Event<Void>());
}
}.execute();
这是转换为Rxjava(不是Rxjava2)的代码:
Observable.defer(new Func0<Observable<Void>>() {
@Override
public Observable<Void> call() {
Set<Map.Entry<String, Participant>> entries = pool.entrySet();
for (Map.Entry<String, Participant> entry : entries) {
Participant participant = entry.getValue();
participant.release();
}
return Observable.just(null);
}
}).doOnCompleted(new Action0() {
@Override
public void call() {
cb.event(new Spin.Event<Void>());
}
})
.subscribeOn(Schedulers.computation())
.subscribe();
将其转换为Rxjava 而不在返回 null 时崩溃的最佳方法是什么。另外,.execute() 相对于Rxjava2 是如何发挥作用的?不确定这是否适用于Rxjava?
这是崩溃日志:
FATAL EXCEPTION: RxComputationThreadPool-3
io.reactivex.exceptions.OnErrorNotImplementedException: null ObservableSource supplied
at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:704)
at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:701)
at io.reactivex.internal.observers.LambdaObserver.onError(LambdaObserver.java:74)
at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeOnObserver.onError(ObservableSubscribeOn.java:63)
at io.reactivex.internal.disposables.EmptyDisposable.error(EmptyDisposable.java:63)
at io.reactivex.internal.operators.observable.ObservableDefer.subscribeActual(ObservableDefer.java:35)
at io.reactivex.Observable.subscribe(Observable.java:10842)
at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeTask.run(ObservableSubscribeOn.java:96)
at io.reactivex.internal.schedulers.ScheduledDirectTask.call(ScheduledDirectTask.java:38)
at io.reactivex.internal.schedulers.ScheduledDirectTask.call(ScheduledDirectTask.java:26)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:154)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.NullPointerException: null ObservableSource supplied
at io.reactivex.internal.functions.ObjectHelper.requireNonNull(ObjectHelper.java:39)
at io.reactivex.internal.operators.observable.ObservableDefer.subscribeActual(ObservableDefer.java:32)
at io.reactivex.Observable.subscribe(Observable.java:10842)
at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeTask.run(ObservableSubscribeOn.java:96)
at io.reactivex.internal.schedulers.ScheduledDirectTask.call(ScheduledDirectTask.java:38)
at io.reactivex.internal.schedulers.ScheduledDirectTask.call(ScheduledDirectTask.java:26)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:154)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
【问题讨论】:
-
不清楚这里是什么为空。请添加堆栈跟踪
-
请发布您的堆栈跟踪,同时您还需要添加 .observeOn(AndroidSchedulers.mainThread())。
-
我会尽快发布。另外,返回 Observable.just(null);这在 rxjava 2 中是否允许?
-
感谢@Geros,请查看崩溃日志。(刚刚编辑了我上面的问题)。另外,有没有更好的方法将我的原始 asynctask 代码转换为 rxjava 2?
标签: android android-asynctask rx-android rx-java2