2016-04-26 6 views
1

Ich mache das ganze während meines Projekts, würde dies zu einem Speicherleck führen? später in einem Verfahren wie dieseBedeutet das Speichern des Aktivitätskontexts in einem DialogFragment einen Speicherverlust?

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

und dann:

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

die oben in Ordnung ist zu tun? Was passiert, wenn ich den AlertDialog in onPostExecute() einer AsyncTask anzeigen möchte?

BEARBEITEN: Wie bereits erwähnt, würde dies zu einem Speicherverlust führen, da ich versuche, über die Lebensdauer hinaus auf den Kontext der Aktivität zuzugreifen.

Aber würde das unten das gleiche Problem verursachen? Was ist eine gute allgemeine Lösung um einen AlertDialog von einem DialogFragment zu zeigen?

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

und dann später in einem Verfahren wie folgt aus:

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

dies ein Speicherleck erzeugen würde, wäre es in einem WeakReference beheben Sie alle Speicherlecks Verpackung?

+1

'Fragment' hat' getActivity() ', die Sie anrufen können, wenn Sie brauchen die Aktivität, die es hostet. – CommonsWare

+0

Ich habe das schon gemacht, aber getActivity() aufgerufen, um zu überprüfen, ob null und wenn nicht null, getActivity() erneut aufrufen, um den Kontext zu bekommen. Ich habe eine NPE davon bekommen, denke ich, weil die Aktivität nach meinem ersten Aufruf von getActivity() gc'ed * right * wurde. Würde das Speichern der Aktivität nach dem ersten Aufruf von getActivity() und deren Verwendung zu Speicherlecks führen? – mpellegr

+1

Sie sollten dadurch nichts gewinnen. Und wenn Sie * sind, liegt das daran, dass Sie ein Speicherleck eingeführt haben. Ihr Fragment sollte nichts mit einer Aktivität in einem Hintergrund-Thread oder nach 'onDetach() 'tun. Zwischen 'onAttach()' und 'onDetach()' sollte 'getActivity()' einen Nicht-'null'-Wert zurückgeben. IMHO, Sie sind bestenfalls über das eigentliche Problem: versuchen, eine Aktivität zu verwenden, wenn Ihr Fragment nicht mit einem funktionieren sollte. – CommonsWare

Antwort

1

Vor dem AlertDialog zeigen Sie prüfen, ob die Fragment zu einem hinzugefügt wird Activity

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

oder

if (isAdded()) { 
    // Show dialog 
}