如何在每次改装API调用中自动显示Progress Bar?

Shu*_* A. 8 android android-progressbar retrofit2

如何在每个Retrofit 2.0API调用上显示进度条,而无需在每个活动中创建进度条,显示和解除.进度条应该 API被命中显示,并且当我们得到响应onResponse或被onFailure调用时它应该被忽略.

我试过这个:

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();
          }
 });
Run Code Online (Sandbox Code Playgroud)

但是每当我进行API调用时,这段代码都必须在任何地方粘贴.我不想要重复的代码.

pet*_*ula 8

您的Activity中的另一个内部类可能会保存您.

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();
      }
}
Run Code Online (Sandbox Code Playgroud)

当您发送请求时:

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*/ 
      }
 });
Run Code Online (Sandbox Code Playgroud)


Shu*_* A. 7

正如@Sourabh 所建议的那样,我最终使用了一个 Base 活动并在每次 API 调用期间调用了简单的方法。在BaseActivity

public void showDialog() {

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

public void hideDialog() {

    if(mProgressDialog != null && mProgressDialog.isShowing())
        mProgressDialog.dismiss();
}
Run Code Online (Sandbox Code Playgroud)

在您的子活动中,您可以直接调用showDialog()hideDialog()来显示和关闭对话框。


Ami*_*lan 7

根据 Shubham 和 peter 的回答,我写了一个这样的类:

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);
    }

}
}
Run Code Online (Sandbox Code Playgroud)

我希望它会帮助你。