2017-09-06 53 views
0

我有一個應用程序,我在其中顯示自定義對話框和吐司消息的所有工作正常,但應用程序有時會崩潰並顯示logg錯誤爲「Fragment LayoutTwo {820b58c}沒有附加到活動」。請幫助。如何解決未附加到活動的片段?

代碼: -

CustomerTicketDialogClass ctdc = new CustomerTicketDialogClass(getActivity(), 
      "network failure", 
      getResources().getString(R.string.NetworkError_Message), "LayoutTwo"); 
ctdc.show(); 
ctdc.setCanceledOnTouchOutside(false); 
+0

https://stackoverflow.com/questions/10919240/fragment-myfragment-not-attached-to-activity –

+0

您可以使用驗證,如果(isAdded() ){}或者你可以使用if(getActivity()!= null){} – YoLo

回答

0

此錯誤發生由於兩個因素的綜合作用:

HTTP請求,完成後,調用任一onResponse()或的onError()(其工作在主線程)而不知道活動是否仍在前臺。如果活動消失(用戶在其他地方導航),則getActivity()返回null。 Volley Response被表示爲一個匿名內部類,它隱式地擁有對外部Activity類的強引用。這導致經典的內存泄漏。 爲了解決這個問題,你應該始終做到:

Activity activity = getActivity(); 

如果(!活動= NULL){

// etc ... 

}

並且還使用isAdded()中的onError( )方法:

@Override 

public void onerror的(VolleyError錯誤){

Activity activity = getActivity(); 
if(activity != null && isAdded()) 
    mProgressDialog.setVisibility(View.GONE); 
    if (error instanceof NoConnectionError) { 
     String errormsg = getResources().getString(R.string.no_internet_error_msg); 
     Toast.makeText(activity, errormsg, Toast.LENGTH_LONG).show(); 
    } 
} 

}