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();
}
これはメモリリークを生成する、弱い参照でラップしても、メモリリークを修正するのでしょうか?
'Fragment'は'あなたが必要なときに呼び出すことができますgetActivityを() '、持っていますそれをホストしている活動。 – CommonsWare
私はこれをやっていましたが、getActivity()を呼び出してnullかどうかを調べ、nullでない場合はgetActivity()をもう一度呼び出してコンテキストを取得しました。私はgetActivity()への最初の呼び出しの後、Activityがgc'ed * right *を取得したので、これを行うことからNPEを取得しました。 getActivity()の最初の呼び出しの後にアクティビティを格納し、それを使用するとメモリリークの可能性がありますか? – mpellegr
これを実行して何かを得るべきではありません。あなたが*の場合、メモリリークを導入したからです。あなたのフラグメントは、バックグラウンドスレッドのアクティビティや 'onDetach()'の後に何もしてはいけません。 'onAttach()'と 'onDetach()'の間で、 'getActivity()'は非 'null'値を返さなければなりません。 IMHO、あなたは、実際の問題を徹底的に突き止めています:あなたのフラグメントが1つのもので動作してはならないときに、アクティビティを使用しようとしています。 – CommonsWare