d4v*_*idi 2 crash android rx-java
我正在尝试在我的 android 应用程序中使用RxJava(版本 1.1.0)。我已经实现了一个简单的 observable/subscriber 模式来通过网络调用 API 调用,就像这样(使用“单一”而不是完全成熟的“可观察”只是因为没有多个事件报告网络调用):
// Observable
Single<Data> observable = Single.create(new Single.OnSubscribe<Data>() {
@Override
public void call(SingleSubscriber<? super Data> singleSubscriber) {
try {
Response<Data> response = mApi.get();
singleSubscriber.onSuccess(response.body());
} catch (Exception e) {
singleSubscriber.onError(e);
}
}
}).subscribeOn(Schedulers.io());
// Subscription
observable
.doOnSuccess(new Action1<Data>() {
@Override
public void call(Data data) {
Log.d("DBG", "success!");
}
})
.doOnError(new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
Log.d("DBG", "error!");
}
})
.subscribe();
Run Code Online (Sandbox Code Playgroud)
正常流程运行良好 - 我看到“成功”日志并收到数据。但是,当发生错误(例如 wifi 已关闭)时,即使处理了错误(报告了“错误!”日志),应用程序也会崩溃,但出现以下异常(已删除):
12-16 07:33:41.572 6705-6952/com.d4vidi.app E/DBG: error!
12-16 07:33:41.572 6705-6952/com.d4vidi.app E/AndroidRuntime: FATAL EXCEPTION: RxComputationThreadPool-4
12-16 07:33:41.572 6705-6952/com.d4vidi.app E/AndroidRuntime: Process: com.d4vidi.app, PID: 6705
12-16 07:33:41.572 6705-6952/com.d4vidi.app E/AndroidRuntime: java.lang.IllegalStateException: Exception thrown on Scheduler.Worker thread. Add `onError` handling.
12-16 07:33:41.572 6705-6952/com.d4vidi.app E/AndroidRuntime: at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:60)
12-16 07:33:41.572 6705-6952/com.d4vidi.app E/AndroidRuntime: at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
12-16 07:33:41.572 6705-6952/com.d4vidi.app E/AndroidRuntime: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
12-16 07:33:41.572 6705-6952/com.d4vidi.app E/AndroidRuntime: at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152)
12-16 07:33:41.572 6705-6952/com.d4vidi.app E/AndroidRuntime: at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265)
12-16 07:33:41.572 6705-6952/com.d4vidi.app E/AndroidRuntime: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
12-16 07:33:41.572 6705-6952/com.d4vidi.app E/AndroidRuntime: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
12-16 07:33:41.572 6705-6952/com.d4vidi.app E/AndroidRuntime: at java.lang.Thread.run(Thread.java:818)
12-16 07:33:41.572 6705-6952/com.d4vidi.app E/AndroidRuntime: Caused by: rx.exceptions.OnErrorNotImplementedException: for
12-16 07:33:41.572 6705-6952/com.d4vidi.app E/AndroidRuntime: at rx.Single$7.onError(Single.java:1380)
12-16 07:33:41.572 6705-6952/com.d4vidi.app E/AndroidRuntime: at rx.observers.SafeSubscriber._onError(SafeSubscriber.java:159)
12-16 07:33:41.572 6705-6952/com.d4vidi.app E/AndroidRuntime: at rx.observers.SafeSubscriber.onError(SafeSubscriber.java:120)
12-16 07:33:41.572 6705-6952/com.d4vidi.app E/AndroidRuntime: at rx.internal.operators.OperatorDoOnEach$1.onError(OperatorDoOnEach.java:71)
12-16 07:33:41.572 6705-6952/com.d4vidi.app E/AndroidRuntime: at rx.internal.operators.OperatorDoOnEach$1.onError(OperatorDoOnEach.java:71)
12-16 07:33:41.572 6705-6952/com.d4vidi.app E/AndroidRuntime: at rx.internal.operators.OperatorSubscribeOn$1$1$1.onError(OperatorSubscribeOn.java:71)
12-16 07:33:41.572 6705-6952/com.d4vidi.app E/AndroidRuntime: at rx.Single$1$1.onError(Single.java:105)
12-16 07:33:41.572 6705-6952/com.d4vidi.app E/AndroidRuntime: at com.d4vidi.app.additem.control.Controller$1.call(Controller.java:27)
12-16 07:33:41.572 6705-6952/com.d4vidi.app E/AndroidRuntime: at com.d4vidi.app.additem.control.Controller$1.call(Controller.java:18)
12-16 07:33:41.572 6705-6952/com.d4vidi.app E/AndroidRuntime: at rx.Single$1.call(Single.java:110)
12-16 07:33:41.572 6705-6952/com.d4vidi.app E/AndroidRuntime: at rx.Single$1.call(Single.java:90)
12-16 07:33:41.572 6705-6952/com.d4vidi.app E/AndroidRuntime: at rx.Observable.unsafeSubscribe(Observable.java:8098)
12-16 07:33:41.572 6705-6952/com.d4vidi.app E/AndroidRuntime: at rx.internal.operators.OperatorSubscribeOn$1$1.call(OperatorSubscribeOn.java:62)
12-16 07:33:41.572 6705-6952/com.d4vidi.app E/AndroidRuntime: at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
12-16 07:33:41.572 6705-6952/com.d4vidi.app E/AndroidRuntime: at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
12-16 07:33:41.572 6705-6952/com.d4vidi.app E/AndroidRuntime: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
12-16 07:33:41.572 6705-6952/com.d4vidi.app E/AndroidRuntime: at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152)
12-16 07:33:41.572 6705-6952/com.d4vidi.app E/AndroidRuntime: at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265)
12-16 07:33:41.572 6705-6952/com.d4vidi.app E/AndroidRuntime: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
12-16 07:33:41.572 6705-6952/com.d4vidi.app E/AndroidRuntime: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
12-16 07:33:41.572 6705-6952/com.d4vidi.app E/AndroidRuntime: at java.lang.Thread.run(Thread.java:818)
Run Code Online (Sandbox Code Playgroud)
这不是 RxJava 最基本的用法吗?为什么它会崩溃,然后,即使错误是在doOnError()回调中处理的- 我在这里遗漏了什么?
在doOnError不处理异常,它可以让你窥视到了异常,但以其他任何方式不影响他们。您仍然必须观察错误并使用onErrorXXX或retry()方法之一对其进行处理,即用有效值替换它,重试几次等。
| 归档时间: |
|
| 查看次数: |
2994 次 |
| 最近记录: |