Vuelva a intentar una llamada con Retrofit 2 y RxJava2 después de mostrar un cuadro de diálogo

Llamo a una API usando Retrofit 2 y RxJava2. Si falla una llamada, en algunos casos (por ejemplo, sin conexión a Internet), quiero mostrar un diálogo de error al usuario y dejar que vuelva a intentarlo.

Como estoy usando RxJava, estaba pensando en usar.retryWhen(...) pero no sé cómo hacerlo, ya que debe esperar a que el usuario presione el botón en el cuadro de diálogo.

En este momento, visualizo el cuadro de diálogo pero vuelve a intentarlo antes de que el usuario presione cualquier botón. Además, me gustaría que la llamada no se vuelva a intentar cuando el usuario presiona 'cancelar'.

Aquí está el código que tengo en este momento:

private void displayDialog(DialogInterface.OnClickListener positive, DialogInterface.OnClickListener negative) {
    AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
    builder.setMessage("Unexpected error, do you want to retry?")
            .setPositiveButton("Retry", positive)
            .setNegativeButton("Cancel", negative)
            .show();
}

private Observable<Boolean> notifyUser() {
    final PublishSubject<Boolean> subject = PublishSubject.create();
    displayDialog(
            (dialogInterface, i) -> subject.onNext(true),
            (dialogInterface, i) -> subject.onNext(false)
    );

    return subject;
}

private void onClick() {
    Log.d(TAG, "onClick");
    getData()
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io())
            .retryWhen(attempts -> {
                return attempts.zipWith(
                        notifyUser(),
                        (throwable, res) -> res);
            })
            .subscribe(
                    s -> {
                        Log.d(TAG, "success");
                    });
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta