Giter Site home page Giter Site logo

rxexponentialbackoff-android's Introduction

RxExponentialBackoff Pattern implemented in Android using RxJava

This repository contains an example of the retry pattern implementation in Android applications. You can also find the iOS implementation at RxExponentialBackoff-iOS

Articles

Component Diagram

RxExponentialBackoff Pattern

Implementation

With constant incremental time window approach:

private void constantRetry(final int maxiTimeRetry) {
    compositeDisposable.add(
            this.operationWithPossibleFailure()
                    .retryWhen(errors -> errors
                            .doOnNext(ignored -> Log.d(TAG, "retrying..."))
                            .delay(2, TimeUnit.SECONDS)
                            .take(maxiTimeRetry)
                            .concatWith(Observable.error(new Throwable())))
                    .onErrorResumeNext(Observable::error)
                    .subscribeOn(Schedulers.computation())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(user -> logs(user, true),
                            throwable -> logs(throwable, false),
                            () -> Log.d(TAG, "completed")));
}

With exponential and random increment time window approach:

private void exponentialWithRandomRetry(final int maxiTimeRetry) {
    compositeDisposable.add(
            this.operationWithPossibleFailure()
                    .retryWhen(errors -> errors
                            .map(throwable -> 1)
                            .scan((attempt, next) -> attempt + next)
                            .map(attempt -> new Pair<>(attempt, this.exponentialBackoff(attempt, true)))
                            .doOnNext(pair -> this.printCurrentTime(pair.first, pair.second))
                            .map(pair -> pair.second)
                            .flatMap(delayTime ->
                                    Observable.just(delayTime)
                                            .delay(delayTime, TimeUnit.SECONDS))
                            .take(maxiTimeRetry)
                            .concatWith(Observable.error(new Throwable("unexpected error in service"))))
                    .onErrorResumeNext(Observable::error)
                    .subscribeOn(Schedulers.computation())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(user -> logs(user, true),
                            throwable -> logs(throwable, false),
                            () -> Log.i(TAG, "completed")));
}

Function to calculate the delay time used in the pattern retry.

private long exponentialBackoff(final int attempt, final boolean withRandom) {
    final long min = -1000L;
    final long max = 1000L;
    if (withRandom) {
        long random_number = min + (long) (Math.random() * (max - min));
        double random_number_milliseconds = random_number * 0.001;
        return (long) (Math.pow(2, attempt) + random_number_milliseconds);
    } else {
        return (long) Math.pow(2, attempt);
    }
}

Demo

RxExponentialBackoff Pattern

Versions of IDEs and technologies used.

  • Android Studio 4.1.2 - Java 8
  • RxJava 3 - RxAndroid 3
  • Activities - Layouts

rxexponentialbackoff-android's People

Contributors

yaircarreno avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.