2010-02-01 14 views
5

J'ai une application Android sur le modèle de l'exemple LunarLander par Google. Je le débogue sur un vrai appareil, (Motorola Droid) avec Android 2.0. Lorsque l'orientation change, le programme se bloque sur un NullPointerException. Logcat de juste avant l'accident:"Quelque chose ne va pas ici, ne vous attendez pas à PACKAGE être repris" erreur dans android Logcat

02-01 00:24:27.956: DEBUG/nate(8358): Starting Game 
02-01 00:24:36.878: DEBUG/dalvikvm(1086): GC freed 1788 objects/92256 bytes in 1389ms 
02-01 00:24:38.542: INFO/WindowManager(1021): Setting rotation to 1, animFlags=0 
02-01 00:24:38.558: INFO/ActivityManager(1021): Config changed: { scale=1.0 imsi=310/4 loc=en_US touch=3 keys=2/1/2 nav=2/2 orien=2 layout=34} 
02-01 00:24:38.620: WARN/UsageStats(1021): Something wrong here, didnt expect org.nifong.leeder to be resumed 
02-01 00:24:38.886: DEBUG/nate(8358): New Surface dimensions: 854x442 
02-01 00:24:38.886: DEBUG/nate(8358): flies was null 

La première ligne qui me préoccupe est "Something wrong here" à 24:38.620. Je n'ai aucune idée de ce que cela signifie, mais je pense que c'est parce que je ne réagis pas correctement au changement d'écran.

Ensuite, je reçois un message de débogage dont je me suis imprimé à partir de ma propre méthode surfaceChanged() sur les nouvelles dimensions de la surface. Ensuite, j'imprimer un message de débogage à savoir si les mouches étaient null. flies est le champ qui provoque finalement le NullPointerException. Son créé une fois, et jamais écrit à nouveau pour le reste du programme. Je sais que ce n'était pas nul avant le crash, car il a été lu plusieurs fois.

Est-ce que quelqu'un a une idée de la façon dont ma variable membre privé est devenu nul simplement par ces indices?

Je voudrais inclure du code mais il y en a beaucoup et je ne sais pas ce qui serait pertinent.

Répondre

2

Je l'ai fixé en ajoutant ces deux lignes à la balise d'activité dans mon fichier manifeste

android:configChanges="keyboardHidden|orientation" 
android:screenOrientation="landscape" 

cela dit que ma demande va gérer les changements de clavier et d'orientation sur son propre (en ne faisant rien) et préfère courir dans le paysage tout le temps.

+0

Cela peut être une solution pour votre application, en fonction de votre cas d'utilisation. À mon avis, c'est un comportement grossier forçant l'utilisateur dans un comportement d'utilisation qu'il déteste peut-être ... – Janusz

3

Les changements d'orientation dans Android affectent l'état. Fondamentalement, votre activité est détruite et recréée. Vous devez donc être conscient de ce que les événements Android lifecycle seront appelés et comment enregistrer l'état.

Vous devez également vous méfier des instances static et de leur impact sur ce cycle de vie.

Here is a blog post expliquant une partie de ceci.