I am trying to figure out how i can resubscribe the same observable for every hour when we have got an error from server for 5 attempts.I know about retryWhen but really not able to understand how i can use it in my case.I am using retrofit for server calls and rxjava to subscribe.
Here is the method where i am making a call using retrofit.Please help with this.
@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); }