それぞれに進捗バーを表示する方法Retrofit 2.0
API呼び出し。各アクティビティで進行状況バーを作成しなくても、それを表示して閉じます。プログレスバーにwhenever 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();
}
});
しかし、このコードは、API呼び出しを行うたびにどこにでも貼り付けてコピーする必要があります。重複するコードは必要ありません。
@Sourabhによって提案されたように、私はBaseアクティビティを使用し、各API呼び出し中に単純なメソッドを呼び出すことになりました。 BaseActivity
では、
_public void showDialog() {
if(mProgressDialog != null && !mProgressDialog.isShowing())
mProgressDialog.show();
}
public void hideDialog() {
if(mProgressDialog != null && mProgressDialog.isShowing())
mProgressDialog.dismiss();
}
_
子アクティビティでは、showDialog()
およびhideDialog()
を直接呼び出して、ダイアログを表示および閉じることができます。
アクティビティ内の別の内部クラスはあなたを救うかもしれません。
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();
}
}
リクエストを送信するとき:
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*/
}
});
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);
}
}
}
お役に立てば幸いです。
恥知らずなプロモーション
私は RxLoadingライブラリ を作成しました、これはそれ以上のことができます、
あなたはこのようなことをすることができます:
networkCall().compose(RxLoading.<>create(loadingLayout)).subscribe(...);
これは、カスタムビュー(loadingLayout)と transformer であるRxLoadingの2つのクラスで構成されており、それらすべてを接着します。両方またはどちらかで作業することを選択できます。
1つのプログレスバーですべてを統制したい場合は、アプリの構造に応じて、それを達成するためのいくつかのオプションがあります。
RxLoadingは、空の状態とエラー状態もサポートします(再試行メカニズムが組み込まれているため、このオプションも確認してください)。
詳細は GitHubページ で確認できます。
チュートリアルの例:
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);
}
チュートリアルリンク: http://www.vogella.com/tutorials/Retrofit/article.html