package licola.demo.com.huabandemo.Observable; import android.content.Context; import java.net.UnknownHostException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import licola.demo.com.huabandemo.Util.Logger; import rx.Observable; import rx.functions.Func1; /** * RetryWithConnectivityIncremental * <p> * Created by hanks on 15-11-29. */ public class RetryWithConnectivityIncremental implements Func1<Observable<? extends Throwable>, Observable<?>> { private final int maxTimeout; private final TimeUnit timeUnit; private final Observable<Boolean> isConnected; private final int startTimeOut; private int timeout; public RetryWithConnectivityIncremental(Context context, int startTimeOut, int maxTimeout, TimeUnit timeUnit) { this.startTimeOut = startTimeOut; this.maxTimeout = maxTimeout; this.timeUnit = timeUnit; this.timeout = startTimeOut; isConnected = getConnectedObservable(context); } @Override public Observable<?> call(Observable<? extends Throwable> observable) { return observable.flatMap((Throwable throwable) -> { Logger.d(throwable.toString()); if (throwable instanceof retrofit2.adapter.rxjava.HttpException ) { return isConnected; } else { return Observable.error(throwable); } }).compose(attachIncementalTimeout()); } private Observable.Transformer<Boolean, Boolean> attachIncementalTimeout() { return observable -> observable.timeout(timeout, timeUnit) .doOnError(throwable -> { Logger.d("attachIncementalTimeout doOnError"+ throwable.toString()); if (throwable instanceof TimeoutException) { timeout = timeout > maxTimeout ? maxTimeout : timeout + startTimeOut; } }); } private Observable<Boolean> getConnectedObservable(Context context) { return BroadcastObservable.fromConnectivityManager(context) .distinctUntilChanged() .filter(isConnected -> isConnected); } }