2016-05-20 2 views
1

Я использую Дооснащение 2, чтобы сделать запрос POST на мой сервер внутри фрагмента, например:Как правильно обрабатывать Dialog.dismiss() внутри фрагмента с помощью Дооснащения 2

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

Однако этот подход не работает нормально, так как пользователь может вращать или оставить текущую активность, что приводит к этой ошибке:

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) 

Как я могу правильно отменить диалог в этой ситуации?

ответ

2

Вы должны закрыть диалоговое окно, когда фрагмент отключится от его действия, или добавьте чек, чтобы проверить, все ли прикреплен фрагмент. Пример ниже вызывает isAdded(), чтобы проверить это.

onResponse() { 
    if (isAdded()) { 
     mProgress.dismiss(); 
    } 
} 
0
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(); 
    } 
}); 
Смежные вопросы