Android: AlertDialog verursacht einen Speicherverlust

Meine Anwendung zeigt ein AlertDialog mit einem ListView im inneren. Alles hat gut funktioniert bun dann habe ich beschlossen, dies zu testen für Speicher-Lecks. Nach dem ausführen der app für einige Zeit, die ich öffnete MATTE und generiert Leck Vermutet-Bericht. MAT fand mehrere ähnliche Lecks:

Einer Instanz von "com.android.intern.app.AlertController$RecycleListView" geladen "<system-class-loader>" nimmt ...

Verbrachte ich viel Zeit mit der Suche für den Grund der Undichtigkeit. Code-review hat mir nicht helfen und ich begann zu googeln. Das ist, was ich gefunden habe:

Problem 5054: AlertDialog zu verursachen scheint ein memory-leak durch eine Nachricht in die MessageQueue

Habe ich beschlossen, um zu überprüfen, ob dieser bug reproduziert oder nicht. Für diesen Zweck erstellte ich ein kleines Programm, welches besteht aus zwei Aktivitäten. MainActivity ist ein enrty Punkt. Es enthält nur die Schaltflächen, die läuft LeakedActivity. Letztere zeigt nur eine AlertDialog in seiner onCreate() Methode. Hier ist der code:

public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        findViewById(R.id.button).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(
                    new Intent(MainActivity.this, LeakedActivity.class));
            }
        });
    }
}

public class LeakedActivity extends Activity {
    private static final int DIALOG_LEAK = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (savedInstanceState == null) {
            showDialog(DIALOG_LEAK);
        }
    }

    @Override
    protected Dialog onCreateDialog(int id) {
        if (id == DIALOG_LEAK) {
            return new AlertDialog.Builder(this)
                .setTitle("Title")
                .setItems(new CharSequence[] { "1", "2" },
                    new OnClickListener() {
                        private final byte[] junk = new byte[10*1024*1024];

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            //nothing
                        }
                    })
                .create();
        }
        return super.onCreateDialog(id);
    }
}

MATTE Berichte dieser Anwendung Lecks com.android.internal.app.AlertController$RecycleListView jedes mal, wenn die AlertDialog abgewiesen und der LeakedActivity fertig ist.

Ich finde keine Fehler in diesem kleinen Programm. Es sieht aus wie ein sehr einfacher Fall mit AlertDialog und es muss gut funktionieren, doch scheint es nicht. Also ich würde gerne wissen, wie um Speicherverluste zu vermeiden, wenn mit AlertDialogs mit Gegenständen. Und warum hat nicht dieses problem behoben wurde, noch? Vielen Dank im Voraus.

InformationsquelleAutor Michael | 2011-08-16

Schreibe einen Kommentar