La aplicación se bloquea después de cambiar la orientación de la pantalla

Tengo el siguiente problema. Después de iniciar, la aplicación funciona bien – incluso después de cambiar la orientación de la pantalla. La aplicación aún no está preparada para manejar cambios de orientación (por ejemplo, diseño alternativo, etc.), de modo que sólo aparece el diseño por defecto rotado y está bien. Sin embargo, cuando salgo de la aplicación presionando la tecla de retroceso, cambiar la orientación e inmediatamente después de iniciar la aplicación de nuevo, se bloquea. Después de un accidente, si empiezo la aplicación una vez más, funciona bien hasta que ocurran las circunstancias descritas anteriormente – luego se bloquea.

He conectado el dispositivo al equipo y ejecutar la aplicación en modo de depuración. Después de reiniciar, se produce una excepción incluso antes de llamar a Create. La llamada de choque sigue:

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] 

Planeo manejar la rotación de la pantalla más adelante, pero hasta entonces, deseo el comportamiento del defecto para trabajar correctamente.

He cancelado sólo el método de la actividad onCreate. También tengo la clase de aplicación personalizada, que crea una instancia de clase de motor utilizada en toda la aplicación:

 public class ProCalcApplication extends Application { private Engine engine; public ProCalcApplication() { super(); engine = new Engine(); } public Engine getEngine() { return engine; } } 

¿Cómo resolver este problema?


He hecho más pruebas. He comentado todo el código, dejando sólo la implementación por defecto del método onCreate (super () + setContentLayout ()). El problema persistió, así que he comentado todo el diseño XML y la aplicación finalmente dejó de estrellarse. Estoy en proceso de clavar abajo de la entrada defectuosa, por favor pararse;)


He encontrado la causa, pero no hay solución. El código XML defectuoso sigue:

 <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> 

¿Puede alguien intentar probar o refutar, que este código falla en circunstancias descritas? O señalar, ¿dónde cometí un error;)

Mi entorno: HTC Desire Z (2.2.1), API 8 utilizado. Versión de Eclipse: Helios Service Release 2 Identificación de la compilación: 20110218-0911.

Editar: Hacer un poco más corto:

 <?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> 

Y un poco más de información; API 8 en emulador: dos cambios de orientación de pantalla (Ctrl + F12) y fallos de aplicación. API 10 en el emulador: dos cambios en la orientación de la pantalla y la pantalla permanece en modo horizontal independientemente de la orientación (sin embargo, la aplicación no se bloquea).

¿Qué me perdí?

Me he enterado, lo que me perdí 🙂 Ya que nadie respondió, voy a dejar una respuesta para todos, que se encontrará con el mismo problema.

Resulta que el problema descrito es un error de bibliotecas de Android generalmente conocido: ViewFlipper falla al manejar el cambio de orientación de pantalla correctamente. Ha aparecido en API 2.1 y continúa hasta 3.0, donde se cree que se fija. Desafortunadamente, la mayoría de los teléfonos inteligentes de hoy sufren este problema, ya que normalmente tienen 2.2 o 2.3 a bordo.

La solución es gestionar manualmente el cambio de orientación de la pantalla (consulte Reinicio de la actividad en la rotación de Android ) o implementar manualmente los cambios y animaciones de la vista, utilizando FrameLayout, visibilidad de la vista y clases de animación.

Otro es usar la clase SafeViewFlipper de Eric Burke:

 /** * Works around Android Bug 6191 by catching IllegalArgumentException after * detached from the window. * * @author Eric Burke ([email protected]) */ public class SafeViewFlipper extends ViewFlipper { public SafeViewFlipper(Context context) { super(context); } public SafeViewFlipper(Context context, AttributeSet attrs) { super(context, attrs); } /** * Workaround for Android Bug 6191: * http://code.google.com/p/android/issues/detail?id=6191 * <p/> * ViewFlipper occasionally throws an IllegalArgumentException after * screen rotations. */ @Override protected void onDetachedFromWindow() { try { super.onDetachedFromWindow(); } catch (IllegalArgumentException e) { Log.d(TAG, "SafeViewFlipper ignoring IllegalArgumentException"); // Call stopFlipping() in order to kick off updateRunning() stopFlipping(); } } } 

Puede usarlo mientras crea el diseño del código, así como incrustarlo en el archivo de diseño xml (tendrá que calificarlo completamente, por ejemplo, <com.myapp.SafeViewFlipper />).

Consulte también http://code.google.com/p/android/issues/detail?id=6191 para obtener más información.

Esto funciona para usted

 package com.palewar; import android.app.Activity; import android.app.ProgressDialog; import android.os.Bundle; import android.os.Handler; import android.os.Message; public class ThreadActivity extends Activity { static ProgressDialog dialog; private Thread downloadThread; final static Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); dialog.dismiss(); } }; protected void onDestroy() { if (dialog != null && dialog.isShowing()) { dialog.dismiss(); dialog = null; } super.onDestroy(); } /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); downloadThread = (Thread) getLastNonConfigurationInstance(); if (downloadThread != null && downloadThread.isAlive()) { dialog = ProgressDialog.show(ThreadActivity.this, "", "Signing in...", false); } dialog = ProgressDialog.show(ThreadActivity.this, "", "Signing in ...", false); downloadThread = new MyThread(); downloadThread.start(); // processThread(); } // Save the thread @Override public Object onRetainNonConfigurationInstance() { return downloadThread; } static public class MyThread extends Thread { @Override public void run() { try { // Simulate a slow network try { new Thread().sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } handler.sendEmptyMessage(0); } finally { } } } } 
  • Evento del dispositivo Android onConfigurationChanged no controla la orientación
  • android: ¿cómo conservo los datos en mi arrayadapter / listview cuando cambia la orientación?
  • Sistema de coordenadas del dispositivo Android Convert a sistema de coordenadas "usuario"
  • Orientación del dispositivo Android sin geomagnética
  • Guardar datos y cambiar la orientación
  • OnOrientationChanged () se llama cuando OrientationEventListener está deshabilitado
  • OnCreate no se llama cuando la pantalla gira - Android
  • Visualización de imágenes de la tarjeta sd en gridview android
  • Aplicación de Android que pierde datos durante el cambio de orientación
  • Android onConfigurationChanged () no se llama en Actividad
  • Las imágenes tomadas con ACTION_IMAGE_CAPTURE siempre devuelven 1 para ExifInterface.TAG_ORIENTATION en algunos dispositivos más nuevos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.