1
5回の試行でサーバーからのエラーが発生したときに、毎回同じ観測情報を再サブスクライブできる方法を見つけようとしています。実際に私のケースでどのように使うことができるのか理解できません。私はサーバコールにレトロフィットを、rxjavaにはサブスクライブを使用しています。rxjavaで5回試行して1時間ごとにリクエストを再試行する方法
私はretrofitを使用して電話をかけています。これを手伝ってください。
@Override
public Observable<Integer> uploadFileToServer(FileUploadData fileUploadData, File file) {
// log.i(TAG, "uploadFileToServer");
FileUploadEndpoint fileUploadEndpoint = null;
try {
fileUploadEndpoint = retrofitServiceFactory.getService(FileUploadEndpoint.class);
} catch (BaseUrlNotFoundException e) {
e.printStackTrace();
// log.i(TAG, "uploadFileToServer" + e.getMessage());
return Observable.just(FileUploadConstants.EXCEPTION_FILE_UPLOAD);
}
// create RequestBody instance from file
RequestBody requestFile =
RequestBody.create(okhttp3.MultipartBody.FORM, file);
// MultipartBody.Part is used to send also the actual file name
MultipartBody.Part body =
MultipartBody.Part.createFormData("uploadfile", file.getName(), requestFile);
// add another part within the multipart request
String descriptionString = "file upload";
RequestBody description =
RequestBody.create(
okhttp3.MultipartBody.FORM, descriptionString);
Map<String, String> queryMap = new HashMap<>();
queryMap.put("SENDER", fileUploadData.getSender());
queryMap.put("SOURCE", fileUploadData.getSource());
queryMap.put("SCHEMEID", fileUploadData.getSchemeId());
queryMap.put("ISPROCESSINGREQ", "false");
queryMap.put("ISENCRYPTED", "true");
queryMap.put("UID", fileUploadData.getSchemeId());
queryMap.put("METADATA", fileUploadData.getMetaData());
final Observable<FileUploadResponse> requestObservable = fileUploadEndpoint.upload(queryMap, description, body);
return requestObservable.map(new Function<FileUploadResponse, Integer>() {
@Override
public Integer apply(FileUploadResponse fileUploadResponse) throws Exception {
if (fileUploadResponse != null) {
int code = fileUploadResponse.getStatusCode();
switch (code) {
case 100:
return FileUploadConstants.FILE_UPLOAD_SUCCESSFUL;
}
}
return FileUploadConstants.EXCEPTION_FILE_UPLOAD;
}
}).retryWhen(new Function<Observable<Throwable>, ObservableSource<?>>() {
@Override
public ObservableSource<?> apply(Observable<Throwable> throwableObservable) throws Exception {
return throwableObservable.zipWith(Observable.range(1, 5), new BiFunction<Throwable, Integer, FileUploadResponse>() {
@Override
public FileUploadResponse apply(Throwable throwable, Integer integer) throws Exception {
return null;//not able to write the logic :(
}
});
}
});
}
@Override
public void setBaseUrl(String baseUrl) {
retrofitServiceFactory.setBaseUrl(baseUrl);
}
private interface FileUploadEndpoint {
@Multipart
@POST("da/appupload/file")
Observable<FileUploadResponse> upload(@QueryMap Map<String, String> additionValues,
@Part("description") RequestBody description,
@Part MultipartBody.Part file);
}
クールのようにそれを使用します!大変ありがとう。 retryWhenを使って内部クラスを使用できるケースを教えてください。概念を理解するだけです。 – anshul
申し訳ありませんが、投稿を編集しました。それは少し誤解を招いていた。私は正しくありませんでした。あなたは他の方法で同じ結果を達成することができます。これは私が使う方法です。要点はretryWhen関数で、リトライを開始するためにonNextまたはonCompleteを送出する必要があるオブザーバブルを提供する必要があることです。そして、それはあなた次第であるという背後にある論理にどのように対処していますか? –
ありがとう – anshul