05 Mai

Problem beim Wechsel der Ausrichtung

Wenn man für das Android OS programmiert und dann seine eigenen Grafiken erstellt und zeichnet, dann kann es vorkommen, dass bei dem Wechsel der Ausrichtung (orientation) von Landscape zu Portait oder umgekehrt das Programm eine Exception wirft und dann abstürzt. Warum ist das so?

[ad#contentadbig]

Ich bin ja ebenfalls ein Neuling in der Android Entwicklung, programmiere nun aber seit 6 Jahren professionell und habe teifgreifendes Wissen und Erfahrungen in den gängisten Programmier- und Scriptsprachen, natürlich auch in Java, das für die Android Entwicklung benötigt wird.
Aber das folgenden Problem hat mich echt beschäftigt. Für mein anstehendes Tutorial über die Einführung in die Grafikprogrammierung unter Android habe ich eine kleine Testapp entwickelt. Dabei ist mir jedesmal beim Wechsel der Orientation von dem Portrait in den Landscape Mode das Programm abgestürzt. Nach ein paar Prüfungen in der LogCat habe ich die Exception OutOfMemory bei der Erstellung meines Hintergrundes gefunden.
Das hat mich stutzen lassen, weil ich diesen Hintergrund nur einmal erzeuge (also puffere) und dann immer wieder auf das Graphics Objekt zeichne. Aus welchem Grund also, sollte sich das Objekt beim Wechsel der Ausrichtung von den Portät in den Landschaftsmodus neu erstellen? Nach einigem forschen fand ich die Ursache bei developer.android.com im Thema Avoiding Memory Leaks (Speicherlöcher vermeiden).

When the screen orientation changes the system will, by default, destroy the current activity and create a new one while preserving its state.

Wie bitte? Beim Wechsel der Ausrichtung wird die Activity neu gestartet? Alle Variablen, die man in seiner Activity hat, werden also zurückgesetzt und alle Berechnungen sind verloren. Auf der Seite wird noch der Vorschlag gegeben die Daten in einem extra Objekt zu speichern und beim Neustart diese wieder zu laden.
Wer kommt denn bitte auf solch eine Idee? Warum sollte man die Activity neustarten? Da hat wohl einer zu tief ins Glas geschaut als diese Idee kam.
Gott sei Dank gibt es in dem Satz noch den Zusatz „by default“. Man scheint das Verhalten des Neustarts der Activity verhindern zu können. Nach einigem weiteren forschen bin ich auf ein Attribut der Activity gestoßen. Mit dem Attribut „configChanges“ kann man Konfigurationen aktivieren beziehungsweise deaktivieren. Die entsprechenden Werte die uns interessieren sind „orientation“, weil wir auf Änderungen von der Ausrichtung nicht reagieren wollen und „keyboardHidden“, für den Fall, dass eine Tastatur exisitert, soll beim nutzen dieser auch keine Ausrichtungsänderung ausgelöst werden soll.
Der folgende Teil kann also genutzt werden, um das Neustarten der Activity beim Ändern der Orientation verhindern :

android:configChanges="orientation|keyboardHidden"
 

Dieser Codeschnipsel muss im Element Activity im AndroidManifest.xml hinzugefügt werden.

Ich hoffe ich konnte einigen eine Menge Sucharbeit ersparen. Falls irgendjemand weiß wieso man auf eine solch sinnfreie Idee wie dem Neustarten der Activity kommt, den würde ich bitten dieses Wissen in den Kommentaren mit mir zu teilen.




Keine Kommentare zu “Problem beim Wechsel der Ausrichtung”

  1. 1
    Jens sagt:

    Anmerkung : Der Grund ist mir natürlich bewußt, man möchte die entsprechende Layout XML für die Ausrichtung laden, aber warum wird das nicht über ein Reload oder sowas erledigt?

Hinterlasse ein Kommentar