L'Application se bloque après l'orientation de l'écran a changé

J'ai le problème suivant. Après le démarrage, l'application fonctionne très bien, même après le changement de l'orientation de l'écran. L'application n'est pas encore préparés à gérer les changement d'orientation (eg. la variante de mise en page, et ainsi de suite), il suffit donc de la rotation mise en page par défaut s'affiche et c'est OK. Cependant, lorsque je quitte l'application en appuyant sur la touche retour en arrière, de changer l'orientation et immédiatement après le démarrage de l'application à nouveau, il se bloque. Après un crash, si je demande une fois de plus, il fonctionne bien jusqu'à ce que le décrit précédemment circonstances - alors il se bloque.

J'ai connecté l'appareil à l'ordinateur et exécuter l'application en mode debug. Après le redémarrage, une exception est levée avant même d'appeler onCreate. Le crash de la pile suivante:

Thread [<1> main] (Suspended (exception IllegalArgumentException))  
WindowManagerImpl.removeViewImmediate(View) line: 262   
Window$LocalWindowManager.removeViewImmediate(View) line: 436   
ActivityThread.handleDestroyActivity(IBinder, boolean, int, boolean) line: 4022 
ActivityThread.handleRelaunchActivity(ActivityThread$ActivityRecord, int) line: 4127    
ActivityThread.access$2400(ActivityThread, ActivityThread$ActivityRecord, int) line: 136    
ActivityThread$H.handleMessage(Message) line: 2183  
ActivityThread$H(Handler).dispatchMessage(Message) line: 99 
Looper.loop() line: 143 
ActivityThread.main(String[]) line: 5068    
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]  
Method.invoke(Object, Object...) line: 521  
ZygoteInit$MethodAndArgsCaller.run() line: 858  
ZygoteInit.main(String[]) line: 616 
NativeStart.main(String[]) line: not available [native method]  

J'ai l'intention de gérer la rotation de l'écran plus tard, mais en attendant, je souhaite que le comportement par défaut pour fonctionner correctement.

J'ai changé seulement le onCreate de l'Activité de méthode. J'ai aussi l'application personnalisée de classe, ce qui crée une instance de l'application utilisée moteur de classe:

public class ProCalcApplication extends Application
{
    private Engine engine;

    public ProCalcApplication()
    {
        super();

        engine = new Engine();
    }

    public Engine getEngine()
    {
        return engine;
    }
}

Comment résoudre ce problème?


J'ai fait quelques tests supplémentaires. J'ai commenté tout le code, ne laissant que le défaut de mise en œuvre de la méthode onCreate (super() + setContentLayout()). Le problème a persisté, j'ai donc commenté toute la mise en page XML et l'application a enfin cessé de s'écraser. Je suis en train de mettre le doigt sur les erreurs de saisie, veuillez en veille 😉


J'ai trouvé la cause, pas encore de solution. Les erreurs de code XML suivant:

<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">

    <android.gesture.GestureOverlayView android:id="@+id/gestureOverlay" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="3">
        <ViewFlipper android:id="@+id/contextArea" android:layout_width="match_parent" android:layout_height="match_parent">

        </ViewFlipper>          
    </android.gesture.GestureOverlayView>

</LinearLayout> 

Quelqu'un peut peut-être essayer de prouver ou de réfuter, que ce code ne fonctionne pas dans les circonstances décrites? Ou point de, où ai-je fais une erreur 😉

Mon environnement: HTC Desire Z (2.2.1), API 8. Eclipse version: Helios Service Release 2
Build id: 20110218-0911.

Edit: en Faire un peu plus court:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
        <ViewFlipper android:id="@+id/contextArea" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="3">                       
        </ViewFlipper>
</LinearLayout>

Et un peu plus d'infos; API 8 dans l'émulateur: deux orientation de l'écran change (Ctrl+F12) et l'application se bloque. API 10 dans l'émulateur: deux orientation de l'écran change et l'écran reste en mode paysage, indépendamment de l'orientation (l'application ne plante pas, tout de même).

Qu'ai-je manqué?

Quel appareil vous tester? Et à ce niveau API? Avez-vous remarqué que votre moteur est la classe la ré-initialisation de l'après-orientation-changement de démarrage? Doit-elle, ou doit-elle pas?
HTC Desire Z. API de niveau 8. Le moteur n'est pas réinitialisé après le changement d'orientation de redémarrer; il n'est pas censé le faire, mais il n'y a pas de mal si il l'a fait (malgré une petite baisse de performance).
Avez-vous vérifié si le moteur est nulle lorsque vous redémarrez? Aussi, avez-vous enregistré ProCalcApplication comme une extension de l'Application dans le manifeste?
Je n'ai pas. Mais la vérité, c'est que l'application est dans un stade précoce, que si le moteur est créé, il n'est pas encore utilisé. Il est donc très improbable, que c'est la cause du problème (je vais vérifier ça de toute façon). Le ProCalcApplication est définie comme l'extension de l'Application, parce que j'ai utilisé l'Éclipse de l'assistant, qui a créé le ProCalcApplication lors de la configuration des champs du manifeste (Et je vais vérifier aussi, juste pour être sûr ;))
J'ai désactivé l'application personnalisée de la classe (qui, en effet, les handicapés de la création du moteur) et le problème persiste. Il semble, que GestureOverlayView combiné avec ViewFlipper en est la cause. Aucune idée pourquoi, si.

OriginalL'auteur Spook | 2011-05-03