Android: excepcional excepción de tiempo de ejecución que no apunta a ninguna clase donde se inicia

Estoy recibiendo esta excepción de ejecución una vez cada mil + sesiones en la aplicación, por lo que es raro y no he sido capaz de reproducirlo.

java.lang.IllegalArgumentException: View not attached to window manager at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:381) at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:226) at android.view.Window$LocalWindowManager.removeView(Window.java:432) at android.app.Dialog.dismissDialog(Dialog.java:278) at android.app.Dialog.access$000(Dialog.java:71) at android.app.Dialog$1.run(Dialog.java:111) at android.os.Handler.handleCallback(Handler.java:587) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:130) at android.app.ActivityThread.main(ActivityThread.java:3691) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:507) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:670) at dalvik.system.NativeStart.main(Native Method) 

¿Alguien sabe cómo reproducirlo, o por qué sucede? O mejor aún, ¿cómo arreglarlo? 🙂

¡Gracias!

EDITAR:

He añadido la sugerencia hecha por Raghav para agregar esto:

 <activity android:label="@string/app_name" android:configChanges="orientation|keyboardHidden" android:name="ActivityName"> 

Pero esto no ha fijado el estrellarse y el estallar todavía está sucediendo.

EDITAR:

He aquí un código típico que utilizo:

 public class ProblemActivity extends BaseListActivity { Dialog dialog; .... @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... // After some action dialog.show(); } public class GetSolutionTopicsTask extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... theParams) { String myUrl = theParams[0]; String problem_id = theParams[1]; String charset = "UTF-8"; String response = null; try { String query = String.format("problem_id=%s", URLEncoder.encode(problem_id, charset)); final URL url = new URL( myUrl + "?" + query ); final HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoOutput(true); conn.setRequestMethod("POST"); conn.setDoOutput(true); conn.setUseCaches(false); conn.connect(); final InputStream is = conn.getInputStream(); final byte[] buffer = new byte[8196]; int readCount; final StringBuilder builder = new StringBuilder(); while ((readCount = is.read(buffer)) > -1) { builder.append(new String(buffer, 0, readCount)); } response = builder.toString(); } catch (Exception e) { } return response; } @Override protected void onPostExecute(String result) { if ( result == null ) { try { dialog.dismiss(); } catch (Exception e) { // nothing } } else { try { dialog.dismiss(); } catch (Exception e) { // nothing } } // End of else } } 

En algunos dispositivos y también en algunos casos la actividad se termina antes de que el diálogo deseche satisfactoriamente o la tarea asíncrona se ejecute en segundo plano, por lo que cuando se llama al diálogo para descartarlo se produce

java.lang.IllegalArgumentException: View not attached to window manager

Ya que el principal hilo ui ya está descartado.

Para solucionar esto puedes rastrear si la actividad terminó, así que haz el diálogo null en onStop de la actividad y luego en onPostExecute comprueba el estado del diálogo; El código será como

 @Override public void onStop() { super.onStop(); dialog = null; } 

Y en onpostexecute

 if (dialog != null) { dialog.dismiss(); } 

ConfigChanges no están causando este problema.

De los registros anteriores parece que un diálogo que se visualizó en la actividad se estaba descartando después de que la actividad ya no es visible.

Si compartió el código o al menos dar los pasos que realiza para obtener el bloqueo, puedo sugerir una solución.

Al cambiar de orientación, Android creará una nueva vista. Es probable que tenga accidentes porque su hilo de fondo está tratando de cambiar el estado en el antiguo. (También puede tener problemas porque su hilo de fondo no está en el hilo de interfaz de usuario)

En su caso específico, parece que está intentando descartar un diálogo cuando sucede, probablemente de un AsyncTask o de un Thread de fondo.

Para solucionarlo, pruebe lo siguiente:

 <activity android:label="@string/app_name" android:configChanges="orientation|keyboardHidden" android:name="ActivityName"> 

La cuestión es que el sistema destruye la actividad cuando se produce un cambio en la configuración. Vea ConfigurationChanges .

Poner eso en el archivo de configuración evita que el sistema destruya tu actividad. En su lugar invoca el método onConfigurationChanged (Configuration).

También hay una pregunta similar y antigua aquí , con más soluciones. Mi respuesta actual es una mezcla de dos respuestas de allí.

¿Utiliza una AsyncTask que podría terminar después de que se destruya la actividad? Android View no adjunto al administrador de la ventana tiene algunas respuestas.

Además, si su aplicación apunta a la API 13 o superior , debería usarla en su manifiesto en lugar de la sugerencia de Raghav (el tamaño de la pantalla cambia con la orientación en las API más recientes):

  <activity android:label="@string/app_name" android:configChanges="orientation|keyboardHidden|screenSize" android:name="ActivityName"> 

En onStop de la actividad dimiss el diálogo. Además antes de llamar a descartar cheque

dialog.isShowing() es verdadero o no.

if(dialog.isShowing())dialog.dismiss();

Desde el código fuente

 private int findViewLocked(View view, boolean required){ synchronized (this){ final int count = mViews != null ? mViews.length : 0; for (int i=0; i<count; i++) { if (mViews[i] == view) { return i; } } if (required) { throw new IllegalArgumentException( "View not attached to window manager"); } return -1; } } 

Puesto que usted está recibiendo esta excepción significa que la vista no se encuentra cuando se despide es llamado.

Estoy bastante seguro de que es el Diálogo que está causando este problema como Chinmoy Debnath señaló.

 private class LongOperation extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... params) { String response = ""; for(int i=0;i<5;i++) { try { response =i; Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } return response; } @Override protected void onPostExecute(String result) { TextView txt = (TextView) findViewById(R.id.output); txt.setText(result); } @Override protected void onPreExecute() { } @Override protected void onProgressUpdate(Void... values) { } 

}

Cambiarlo con su código. Es un problema de versión. Después de la versión tres no establecemos la vista en el hilo principal, así que tenemos que usar la tarea asincrónica …

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.