Android Heap-Größen verstehen

Ich bin ziemlich neu in der Android-Entwicklung und kann die Java Out of Memory-Ausnahme anscheinend nicht verstehen. Ich weiß, es bedeutet, dass meine App das VM-Budget überschritten hat, aber nachdem ich so oft gegoogelt habe, scheine ich dieses Konzept immer noch nicht zu verstehen. Ich befürchte, dass meine App zu viel Speicher belegt, da ich pro Bildschirm sechs Schaltflächenselektoren mit zwei Bitmaps für jeden Selektor habe, die je nach Registerkarte "Eigenschaften" etwa 20 KB groß sind. Auf meinem verwurzelten G2x habe ich das VM-Budget auf 12 MB festgelegt, mein Telefon neu gestartet und meine App ohne Probleme ausgeführt. Ich entbinde Drawables von jedem onDestroy () und weise darauf hin, dass der GC auch hier laufen soll. Nachdem ich die App eine Weile im Emulator verwendet habe, klicke ich auf meinem DDMS-Bildschirm auf "Cause GC" und die Ergebnisse sind ID = 1, Heap Size 6.133 MB, Allocated 2.895 MB, Free 3.238 MB,% Used 47.20, # Objects 52.623.

Hier verstehe ich nicht, was passiert, mein Emulator ist auf 24 MB VM eingestellt. Wo ist diese Nummer? Das eigentliche Problem, das ich habe, ist, dass wenn ich den Emulator auf 16 MB VM stelle, meine App bei der zweiten Aktivität mit der Ausnahme "Out of Memory" abstürzt. Wie kommt es, dass es auf meinem Telefon mit einer VM von 12 MB oder auf meinem alten HTC Magic-Telefon mit 12 MB VM-Bestand nicht abstürzt? Glaubt ihr auch, dass meine App zu viel Speicherplatz beansprucht? Ich habe keine Ahnung, ob diese DDMS-Nummern gut sind oder nicht. Vielen Dank für Ihre Zeit.

Was meinen Code betrifft, habe ich jedes Bild in XML-Layouts spezifiziert. Ich mache mit ihnen nichts Programmatisches, außer dass ich ihnen Listener hinzufüge. Ich habe diesen Code hier gefunden und ich habe ihn zu jeder Aktivität hinzugefügt, die ich habe ...

@Override
protected void onDestroy() {
    super.onDestroy();

    unbindDrawables(findViewById(R.id.myRootLayout));
    System.gc();
}

private void unbindDrawables(View view) {
    if (view.getBackground() != null) {
        view.getBackground().setCallback(null);
    }
    if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
        for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
            unbindDrawables(((ViewGroup) view).getChildAt(i));
        }
        ((ViewGroup) view).removeAllViews();
    }
}

Andernfalls füge ich den Schaltflächen mit den PNG-Hintergründen nur onClickListeners hinzu. Ich möchte lernen, wie man Schaltflächenhintergründe programmatisch festlegt, aber ich muss die Auswahlfunktionen wie Fokus, Druck, Nicht-Fokus, aber gedrückt usw. haben, damit sich die Schaltflächenhintergründe entsprechend der Benutzerinteraktion ändern. Ich habe die Dokumentation dazu durchgesehen, aber es scheint überwältigend zu sein. Deshalb habe ich mir vorgenommen, hier mit den Grundlagen der Verwaltung von Heaps zu beginnen und mich daran zu arbeiten, Selektoren im Code anzugeben. Dies ist möglicherweise nicht sinnvoll, aber gibt es eine "gesunde" Menge an Speicherzuweisung, die eine App zuweisen könnte, ohne sich der Ausnahme "Nicht genügend Speicher" zu nähern? Wenn einer App beispielsweise 6 MB zugewiesen werden, sollte dies in Ordnung sein, aber 8 MB würden sie überlasten. Gibt es solche Einschränkungen bei der Speicherzuweisung? Nochmals vielen Dank, Alex Lockwood, für Ihre Antwort. Ich werde sie noch einmal lesen und wiederholen, bis dieses Zeug für mich Sinn ergibt

Antworten auf die Frage(2)

Ihre Antwort auf die Frage