2016-04-26 3 views
1

私はプロジェクト全体を通して次のことをしています。これはメモリリークを引き起こすでしょうか?アクティビティコンテキストをDialogFragmentに格納するとメモリリークが発生しますか?

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    mContext = activity; 
} 

れ、その後、このような方法で:

new AlertDialog.Builder(mContext) 
       .setTitle(getActivity().getString(
         R.string.common_error)) 
       .setMessage(getActivity().getString(
         R.string.common_please_try_again)) 
       .setPositiveButton(android.R.string.yes, null) 
       .show(); 

は、上記の[OK]をしているのですか? AsyncTaskのonPostExecute()にAlertDialogを表示しようとするとどうなりますか?

編集:これは、ライフ・タイムを超えてアクティビティーのコンテキストにアクセスしようとしているため、メモリー・リークが発生します。

しかし、以下の問題が同じ問題を引き起こしますか? DialogFragmentからAlertDialogを表示するための良い一般的な解決策は何ですか?

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    mCallback = (MyCallback)activity; 
} 

れ、その後、このような方法で:

if(mCallback != null){ 
    mCallback.showAlertDialog(); 
} 

これはメモリリークを生成する、弱い参照でラップしても、メモリリークを修正するのでしょうか?

+1

'Fragment'は'あなたが必要なときに呼び出すことができますgetActivityを() '、持っていますそれをホストしている活動。 – CommonsWare

+0

私はこれをやっていましたが、getActivity()を呼び出してnullかどうかを調べ、nullでない場合はgetActivity()をもう一度呼び出してコンテキストを取得しました。私はgetActivity()への最初の呼び出しの後、Activityがgc'ed * right *を取得したので、これを行うことからNPEを取得しました。 getActivity()の最初の呼び出しの後にアクティビティを格納し、それを使用するとメモリリークの可能性がありますか? – mpellegr

+1

これを実行して何かを得るべきではありません。あなたが*の場合、メモリリークを導入したからです。あなたのフラグメントは、バックグラウンドスレッドのアクティビティや 'onDetach()'の後に何もしてはいけません。 'onAttach()'と 'onDetach()'の間で、 'getActivity()'は非 'null'値を返さなければなりません。 IMHO、あなたは、実際の問題を徹底的に突き止めています:あなたのフラグメントが1つのもので動作してはならないときに、アクティビティを使用しようとしています。 – CommonsWare

答えて

1

Fragmentが追加されたかどうかをチェックすることができAlertDialogを示す前Activity

if (getActivity != null) { 
    // Show dialog 
} 

または

if (isAdded()) { 
    // Show dialog 
} 
関連する問題