如何使用 Retrofit 2 更正片段内的句柄 Dialog.dismiss()

How to correct handle Dialog.dismiss() inside Fragment using Retrofit 2

我正在使用 Retrofit 2 在 Fragment 中向我的服务器发出 POST 请求,如下所示:

Call<MyResponse> call = apiService.myPost(params);
call.enqueue(myCallback);

mProgress = ProgressDialog.show(getActivity(), "Working", "Working"", true);

我想在请求完成时关闭 ProgressDialog,如您在此处所见:

class myCallback {
    onResponse() {
       mProgress.dismiss();
    }
    onFailture() {
       mProgress.dismiss();
    }
}

但是这种方法效果不佳,因为用户可以旋转或离开当前 Activity,导致此错误:

Fatal Exception: java.lang.IllegalArgumentException: View=com.android.internal.policy.impl.PhoneWindow$DecorView{1ec6c6d0 V.E..... R.....ID 0,0-513,242} not attached to window manager
       at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:396)
       at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:322)
       at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:116)
       at android.app.Dialog.dismissDialog(Dialog.java:341)
       at android.app.Dialog.dismiss(Dialog.java:324)

在这种情况下如何正确关闭对话框?

您应该在 Fragment 与其 Activity 分离时关闭该对话框,或者添加一个检查以查看 Fragment 是否仍然附加。下面的示例调用 isAdded() 来检查这一点。

onResponse() {
     if (isAdded()) {
         mProgress.dismiss();
     }
}
Call<MyResponse> call = apiService.myPost(params);
call.enqueue(new Callback<MyResponse>() {
    @Override
    public void onResponse(Response<Repo> response) {
        mProgress.dismiss();
    }

    @Override
    public void onFailure(Throwable t) {
        mProgress.dismiss();
    }
});