web-dev-qa-db-fra.com

Comment afficher automatiquement la barre de progression sur chaque appel d'API de conversion?

Comment afficher une barre de progression sur chaque appel d'API Retrofit 2.0 sans avoir à créer de barre de progression dans chaque activité, de la montrer et de la fermer. La barre de progression doit afficher à chaque fois que une API est touchée et elle doit être ignorée lorsque nous obtenons une réponse. onResponse ou onFailure est appelé.

J'ai essayé ceci:

ProgressDialog mProgressDialog = new ProgressDialog(this);
mProgressDialog.setIndeterminate(true);
mProgressDialog.setMessage("Loading...");
mProgressDialog.show();
retrofitService.login(new SignInRequest(email, password),
                new Callback<SignInResponse>() {
         @Override
         public void onResponse(Call<SignInResponse> call, Response<SignInResponse> response) {

              if (mProgressDialog.isShowing())
                  mProgressDialog.dismiss();
          }

         @Override
         public void onFailure(Call<SignInResponse> call, Throwable t) {
              if (mProgressDialog.isShowing())
                  mProgressDialog.dismiss();
          }
 });

Mais ce code devra être collé partout lorsque je passe un appel API. Je ne veux pas de code en double.

6
Shubham A.

Comme suggéré par @Sourabh, j'ai fini par utiliser une activité de base et à appeler une méthode simple lors de chaque appel d'API. Dans BaseActivity,

public void showDialog() {

    if(mProgressDialog != null && !mProgressDialog.isShowing())
        mProgressDialog.show();
}

public void hideDialog() {

    if(mProgressDialog != null && mProgressDialog.isShowing())
        mProgressDialog.dismiss();
}

Dans votre activité enfant, vous pouvez directement appeler showDialog() et hideDialog() pour afficher et fermer la boîte de dialogue.

3
Shubham A.

Une autre classe interne à votre activité pourrait vous sauver.

class MyCallBack implements CallBacks<T>{
  @Override
     public void onResponse(Call<T> call, Response<T> response) {

          if (mProgressDialog.isShowing())
              mProgressDialog.dismiss();
      }

     @Override
     public void onFailure(Call<SignInResponse> call, Throwable t) {
          if (mProgressDialog.isShowing())
              mProgressDialog.dismiss();
      }
}

Lorsque vous envoyez une demande:

retrofitService.login(new SignInRequest(email, password),
            new MyCallback<SignInResponse>() {
     @Override
     public void onResponse(Call<SignInResponse> call, Response<SignInResponse> response) {
          super(call, response);
          //do more on response
      }

     @Override
     public void onFailure(Call<SignInResponse> call, Throwable t) {
          super(call, error);
          /* Do more on failure. For example: give a reason why the
           request failed*/ 
      }
 });
7
peter

Basé sur les réponses de Shubham et Peter, j'ai écrit un cours comme celui-ci:

class CustomCallBack<T> implements Callback<T> {

private ProgressDialog mProgressDialog;
Context context;

CustomCallBack(Context context) {
    this.context = context;
    mProgressDialog = new ProgressDialog(context);
    ((Activity) context).getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
            WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
    mProgressDialog.setIndeterminate(true);
    mProgressDialog.setMessage("Loading...");
    mProgressDialog.setCanceledOnTouchOutside(false);
    mProgressDialog.show();

}

@Override
public void onResponse(Call<T> call, Response<T> response) {
    if (mProgressDialog.isShowing()) {
        mProgressDialog.dismiss();
        ((Activity) context).getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
    }

}

@Override
public void onFailure(Call<T> call, Throwable t) {
    if (mProgressDialog.isShowing()) {
        mProgressDialog.dismiss();
        ((Activity) context).getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
    }

}
}

J'espère que cela vous aidera.

3
emiraslan

Promotion sans vergogne

J'ai créé bibliothèque RxLoading pour cela, il peut faire ceci et bien plus encore,

vous pouvez simplement faire quelque chose comme ceci:

networkCall().compose(RxLoading.<>create(loadingLayout)).subscribe(...);

il se compose de 2 classes, une vue personnalisée (loadingLayout) et RxLoading qui est un transformateur qui colle le tout ensemble, vous pouvez choisir de travailler avec les deux, ou l’un des deux.

Si vous souhaitez qu'une seule barre de progression les règle tous, vous avez plusieurs options pour y parvenir, en fonction de la structure de votre application: 

  • une activité multiples fragments -> il suffit de mettre un loadingLayout dans l'écran principal et de lui dire de masquer la disposition des fragments lors du chargement
  • activités multiples: créer une activité de base qui utilise tout et injecter un loadLayout à toutes les vues 
  • vous pouvez également créer une boîte de dialogue ou une activité spéciale pour la barre de progression et utiliser une interface pour RxLoading pour l'afficher et la masquer.

RxLoading prend également en charge les états vide et d'erreur (avec un mécanisme de nouvelle tentative intégré, assurez-vous également de cocher cette option) 

pour en savoir plus, consultez la page GitHub .

1
ndori

Exemple de tutoriel:

   protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
    requestWindowFeature(Window.FEATURE_PROGRESS);
    ArrayAdapter<Question> arrayAdapter =
            new ArrayAdapter<Question>(this,
                    Android.R.layout.simple_list_item_1,
                    Android.R.id.text1,
                    new ArrayList<Question>());
    setListAdapter(arrayAdapter);
    setProgressBarIndeterminateVisibility(true);
    setProgressBarVisibility(true);
}

Lien vers le tutoriel: http://www.vogella.com/tutorials/Retrofit/article.html

0
Nenco