尽管实现了 doOnError,但 RxAndroid 使应用程序崩溃
RxAndroid crashes the app although doOnError is implemented
我有以下代码。它基本上是尝试将所有数据从特定 SQLite table 发送到 DynamoDB:
Observable.create(new Observable.OnSubscribe<Area>() {
@Override
public void call(Subscriber<? super Area> subscriber) {
try {
for (Area item : areaDao.listAll()) {
subscriber.onNext(item);
}
subscriber.onCompleted();
} catch (Exception e) {
subscriber.onError(e);
}
}
}).flatMap(new Func1<Area, Observable<Area>>() {
@Override
public Observable<Area> call(Area area) {
dynamoDBMapper.save(area);
return Observable.just(area);
}
}).observeOn(
AndroidSchedulers.mainThread()
).doOnError(new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
Log.w("AreaHandler", "Could not upload area", throwable);
}
}).doOnCompleted(new Action0() {
@Override
public void call() {
Toast.makeText(ctx, R.string.toast_upload_successful, Toast.LENGTH_SHORT).show();
}
}).subscribeOn(
Schedulers.io()
).subscribe(new Action1<Area>() {
@Override
public void call(Area area) {
areaDao.delete(area.getId());
}
});
我正尝试在禁用互联网连接的模拟器上运行它,发生的事情是 Dynamo 客户端做了几次(失败的)重试,然后抛出异常并使应用程序。从我在文档中读到的内容来看,异常应该被 doOnError 吞噬,而不是被释放到野外并杀死进程。
我错过了什么?
你抓错地方了。 doOnError
用于副作用。它不处理错误。
方案1.传入两个Action1
Observable.just(1, 2, 3)
.subscribe(
new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println(integer);
}
},
new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
System.err.print(throwable);
}
});
选项 2:传入观察者
Observable.just(1, 2, 3)
.subscribe(new Observer<Integer>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable throwable) {
System.err.print(throwable);
}
@Override
public void onNext(Integer integer) {
System.out.println(integer);
}
});
我有以下代码。它基本上是尝试将所有数据从特定 SQLite table 发送到 DynamoDB:
Observable.create(new Observable.OnSubscribe<Area>() {
@Override
public void call(Subscriber<? super Area> subscriber) {
try {
for (Area item : areaDao.listAll()) {
subscriber.onNext(item);
}
subscriber.onCompleted();
} catch (Exception e) {
subscriber.onError(e);
}
}
}).flatMap(new Func1<Area, Observable<Area>>() {
@Override
public Observable<Area> call(Area area) {
dynamoDBMapper.save(area);
return Observable.just(area);
}
}).observeOn(
AndroidSchedulers.mainThread()
).doOnError(new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
Log.w("AreaHandler", "Could not upload area", throwable);
}
}).doOnCompleted(new Action0() {
@Override
public void call() {
Toast.makeText(ctx, R.string.toast_upload_successful, Toast.LENGTH_SHORT).show();
}
}).subscribeOn(
Schedulers.io()
).subscribe(new Action1<Area>() {
@Override
public void call(Area area) {
areaDao.delete(area.getId());
}
});
我正尝试在禁用互联网连接的模拟器上运行它,发生的事情是 Dynamo 客户端做了几次(失败的)重试,然后抛出异常并使应用程序。从我在文档中读到的内容来看,异常应该被 doOnError 吞噬,而不是被释放到野外并杀死进程。
我错过了什么?
你抓错地方了。 doOnError
用于副作用。它不处理错误。
方案1.传入两个Action1
Observable.just(1, 2, 3)
.subscribe(
new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println(integer);
}
},
new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
System.err.print(throwable);
}
});
选项 2:传入观察者
Observable.just(1, 2, 3)
.subscribe(new Observer<Integer>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable throwable) {
System.err.print(throwable);
}
@Override
public void onNext(Integer integer) {
System.out.println(integer);
}
});