Amazon web services RXJava2+;AWS SDK:从AWS S3 TransferListener调用onError时获取UndeliverableException
我使用RXJava(RXAndroid)来序列化一组awss3传输请求 我正在使用AWS TransferUtility,它提供了一个异步TransferListener,可以获取进度和错误通知 我很难传播这些错误 我的代码是这样的Amazon web services RXJava2+;AWS SDK:从AWS S3 TransferListener调用onError时获取UndeliverableException,amazon-web-services,amazon-s3,rx-android,rx-java2,Amazon Web Services,Amazon S3,Rx Android,Rx Java2,我使用RXJava(RXAndroid)来序列化一组awss3传输请求 我正在使用AWS TransferUtility,它提供了一个异步TransferListener,可以获取进度和错误通知 我很难传播这些错误 我的代码是这样的 for (final String subscription : subscriptions) { Observable<String> thisObservable = new Observable<String>
for (final String subscription : subscriptions) {
Observable<String> thisObservable = new Observable<String>() {
@Override
protected void subscribeActual(Observer<? super String> observer) {
new S3Loader(subscription, observer).load();
// The S3Loader uses AWS TransferListener to call onNext and onError of the observers
}
};
observables.add(thisObservable);
Log.v(this, "Added %s", subscription);
}
Observable.concat(observables)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<String>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
Log.v(OperationalStatusFragment.this, "Subscribed...");
}
@Override
public void onNext(@NonNull String s) {
Log.v(OperationalStatusFragment.this, "Started weather operation \"%s\"", s);
}
@Override
public void onError(@NonNull Throwable e) {
Log.e(OperationalStatusFragment.this, "An error happened...");
}
@Override
public void onComplete() {
Log.v(OperationalStatusFragment.this, "Completed...");
}
}
);
编辑2:以下是S3loader.load()的外观:
public void load() {
observer.onNext(subscription);
AmazonS3Client s3Client = new AmazonS3Client();
TransferUtility transferUtility = new TransferUtility(s3Client, context);
TransferObserver observer = transferUtility.download(BUCKET, subscription, file);
observer.setTransferListener(new TransferListener() {
@Override
public void onStateChanged(int id, TransferState state) {
if (state == TransferState.COMPLETED) {
observer.onComplete();
} else if (state == TransferState.FAILED) {
observer.onError(new IOException("An error happened"));
}
}
@Override
public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) {
}
@Override
public void onError(int id, Exception e) {
observer.onError(e);
}
});
}
显示实际的stacktrace以及如何实现S3Loader将非常有用。还有,为什么不使用
创建?@akarnodkd,我添加了堆栈跟踪和加载代码。我没有使用create,因为我使用了concat
。我不确定我是否也应该有一个create
。RxJava的版本是什么?也请使用observatable。create
遵守observatable协议。@akarnokd,这是RXJava2。你能不能在“可观察的。创造一个尊重可观察的协议”上说一点?
public void load() {
observer.onNext(subscription);
AmazonS3Client s3Client = new AmazonS3Client();
TransferUtility transferUtility = new TransferUtility(s3Client, context);
TransferObserver observer = transferUtility.download(BUCKET, subscription, file);
observer.setTransferListener(new TransferListener() {
@Override
public void onStateChanged(int id, TransferState state) {
if (state == TransferState.COMPLETED) {
observer.onComplete();
} else if (state == TransferState.FAILED) {
observer.onError(new IOException("An error happened"));
}
}
@Override
public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) {
}
@Override
public void onError(int id, Exception e) {
observer.onError(e);
}
});
}