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.
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.
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*/
}
});
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.
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:
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 .
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