2017-09-07 1 views
0

Il est très souvent que j'ai besoin de montrer un comportement de chargement dans mon application et je veux le rejeter une fois le travail effectué - peu importe si le résultat du travail est un succès ou une erreur. Par conséquent, je me retrouve avec un code comme celui-ci:Existe-t-il une méthode qui s'exécute après OnSuccess() ou onError() d'Observable?

addDisposable(router.launchHomepage()        
    .compose(loadingView.show())) 
    .subscribe(
     { loadingView.dismiss() }, 
     { loadingView.dismiss() } 
    ) 
) 

Y at-il un moyen de rejeter la vue de chargement dans une seule méthode? Comme mais appelé peu importe si le résultat est le succès ou l'erreur?

+0

utilisation vous Rxjava1 ou Rxjava2? –

+0

Utilisation de RxJava2 ... –

+0

Ok. Je vais vous donner mon code source –

Répondre

2

créer la classe

import android.app.Dialog; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.support.annotation.NonNull; 
import android.support.v4.app.Fragment; 

import io.reactivex.FlowableTransformer; 
import io.reactivex.ObservableTransformer; 
import io.reactivex.SingleTransformer; 
import io.reactivex.functions.Action; 
import io.reactivex.functions.Consumer; 

public class RxShowDialogUtil { 

private ProgressDialog dialog; 
private final Context context; 

private final Consumer SUBSCRIBE_ACTION = new Consumer() { 
    @Override 
    public void accept(@NonNull Object o) throws Exception { 
     if (dialog != null && !dialog.isShowing()) { 
      dialog.show(); 
     } 
    } 
}; 

private final Action UN_SUBSCRIBE_ACTION = new Action() { 
    @Override 
    public void run() throws Exception { 
     if (dialog != null && dialog.isShowing()) { 
      dialog.dismiss(); 
     } 
     dialog = null; 
    } 
}; 

private RxShowDialogUtil(Context context) { 
    this.context = context; 
} 

public static RxShowDialogUtil createInstance(Context context) { 
    return new RxShowDialogUtil(context); 
} 

public static RxShowDialogUtil createInstance(Fragment fragment) { 
    return new RxShowDialogUtil(fragment.getActivity()); 
} 

public <T> SingleTransformer<T, T> applyDialogForSingle() { 
    createDialog(context); 
    return upstream -> upstream.doOnSubscribe(SUBSCRIBE_ACTION).doFinally(UN_SUBSCRIBE_ACTION); 
} 

public <T> ObservableTransformer<T, T> applyDialogForObservable() { 
    createDialog(context); 
    return upstream -> upstream.doOnSubscribe(SUBSCRIBE_ACTION).doFinally(UN_SUBSCRIBE_ACTION); 
} 

public <T>FlowableTransformer<T,T> applyDialogForFlowable(){ 
    createDialog(context); 
    return upstream -> upstream.doOnSubscribe(SUBSCRIBE_ACTION).doFinally(UN_SUBSCRIBE_ACTION); 
} 

private Dialog createDialog(final Context context) { 
    if (dialog == null) { 
     dialog = DialogUtils.getInstance().getProgressDialog(context); 
    } 
    return dialog; 
} 
} 

Et Utilisez

addDisposable(router.launchHomepage()        
.compose(RxShowDialogUtil.createInstance(this).applyDialogForObservable()) 
.subscribe(
    { }, 
    { } 
) 
) 
+0

Awesome! J'ai compris la réponse complète que vous avez donnée mais le '' 'doFinally()' '' est exactement ce que je cherchais! Merci –