2017-09-06 16 views
0

私はカスタムダイアログとトーストのメッセージをすべて表示しているアプリを持っていますが、アプリケーションはいつかクラッシュして、「フラグメントレイアウト2(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

このエラーは、2つの要因の複合効果に起こる:

HTTPリクエスト、完全な、呼び出しのいずれかで動作onResponse()またはのonError()(主なスレッド)を表示することができます。 Activityがなくなった場合(ユーザーが他の場所に移動した場合)、getActivity()はnullを返します。 Volley Responseは、匿名の内部クラスとして表現され、暗黙的に外部のActivityクラスへの強い参照を保持します。これにより、古典的なメモリリークが発生します。 この問題を解決するために、あなたは常に行う必要があります。

Activity activity = getActivity(); 

(!活動= null)の場合は{

// etc ... 

}

も、(のonErrorでisAdded()を使用)メソッド:

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

}

関連する問題