Por qué recibo un error "¡El canal está irrecuperablemente roto y se eliminará!"

104

Cuando intento lanzar mi actividad AndEngine , aparece este error:

ERROR/InputDispatcher(21374): channel '4122e148 my.package.AcGame (server)' ~ Channel is unrecoverably broken and will be disposed!

La aplicación no se bloquea, pero hay una pantalla negra y el dispositivo no reacciona al presionar los botones 'atrás' o 'inicio'.

Alguien sabe cual es el problema?

tío Lem
fuente
No se puede adivinar mucho a partir de la información que proporcionó (agregue más). Pero esto podría ayudar: stackoverflow.com/questions/5551929/inputdispatcher-error Compruebe si hay fugas de memoria.
Jong
10
Ese error aparece después de que una aplicación falla (o se detiene a la fuerza). La parte de Android que reenvía eventos de entrada (pulsaciones de pantalla táctil, etc.) a su aplicación ha notado que su objetivo ya no está allí. Busque un error que ocurra antes de ese.
zapl
1
@ tío Lem, hermano, incluso yo estoy atrapado en el mismo problema. No puedo realizar ninguna operación hasta que reinicie el teléfono. ¿Obtuviste alguna solución? Estoy harto de este problema ..
krishnamurthy

Respuestas:

39

Una de las razones más comunes por las que veo ese error es cuando intento mostrar un cuadro de diálogo de alerta o un cuadro de diálogo de progreso en una actividad que no está en primer plano. Como cuando un hilo en segundo plano que muestra un cuadro de diálogo se ejecuta en una actividad en pausa.

Lou Morda
fuente
2
Establezca el cuadro de diálogo en nulo en onPause y verifique si es nulo antes de mostrar el cuadro de diálogo en el hilo de fondo.
Lou Morda
En mi caso, recibí el error porque comenté los métodos onResume (), onStart, onStop, onPause, onDestroy y onLowMemory. ¡Gracias @LouMorda por la pista!
Maryoomi1
13

Creo que tienes pérdidas de memoria en alguna parte. Puede encontrar consejos para evitar pérdidas de memoria aquí . También puede aprender sobre herramientas para rastrearlo aquí .

Roman Negro
fuente
9

¿Ha utilizado otro hilo de interfaz de usuario? No debe usar más de 1 hilo de UI y hacer que parezca un sándwich. Hacer esto provocará pérdidas de memoria.

He resuelto un problema similar hace 2 días ...

Para ser breve: el hilo principal puede tener muchos hilos de IU para realizar múltiples trabajos, pero si un subproceso que contiene un hilo de IU está dentro de él, es posible que el hilo de IU no haya terminado su trabajo todavía mientras que el hilo principal ya haya terminado su funciona, esto provoca pérdidas de memoria.

Por ejemplo ... para la aplicación Fragment & UI ... esto provocará pérdidas de memoria.

getActivity().runOnUiThread(new Runnable(){

   public void run() {//No.1

  ShowDataScreen();

getActivity().runOnUiThread(new Runnable(){

    public void run() {//No.2

Toast.makeText(getActivity(), "This is error way",Toast.LENGTH_SHORT).show();

    }});// end of No.2 UI new thread

}});// end of No.1 UI new thread

Mi solución es reorganizar de la siguiente manera:

getActivity().runOnUiThread(new Runnable(){

   public void run() {//No.1

ShowDataScreen();

}});// end of No.1 UI new thread        

getActivity().runOnUiThread(new Runnable(){

   public void run() {//No.2

Toast.makeText(getActivity(), "This is correct way",Toast.LENGTH_SHORT).show();

}});// end of No.2 UI new thread

para tu referencia.

Soy taiwanés, me complace responder aquí una vez más.

Jackie_Hung
fuente
6

Puede ver el código fuente sobre esta salida aquí :

void InputDispatcher::onDispatchCycleBrokenLocked(
        nsecs_t currentTime, const sp<Connection>& connection) {
    ALOGE("channel '%s' ~ Channel is unrecoverably broken and will be disposed!",
            connection->getInputChannelName());
    CommandEntry* commandEntry = postCommandLocked(
            & InputDispatcher::doNotifyInputChannelBrokenLockedInterruptible);
    commandEntry->connection = connection;
}

Es porque por ciclo roto bloqueado ...

codezjx
fuente
13
¿Puede explicar qué significa ciclo roto bloqueado?
Jaydev
4

Recibí un error similar (mi aplicación falla) después de cambiar el nombre de algo en strings.xml y me olvidé de modificar otros archivos (un archivo de recursos xml de preferencia y un código Java).

IDE (estudio de Android) no mostró ningún error. Pero, después de que reparé mis archivos xml y código java, la aplicación funcionó bien. Entonces, tal vez haya algunos pequeños errores en sus archivos xml o constantes.

ishitcno1
fuente
Sin embargo, demasiado generalizado para ser entendido :)
Naga
2

Yo tuve el mismo problema. El mío se debió a un tercer jar, pero el logcat no detectó la excepción, lo resolví actualizando el tercer jar, espero que esto ayude.

yangzx
fuente
2

Cuando enfrenté este error, en algún lugar de su código, sus funciones o bibliotecas que solían ejecutarse en diferentes subprocesos, así que intente llamar a todo el código en el mismo subproceso, solucionó mi problema.

Si llama a métodos en WebView desde cualquier hilo que no sea el hilo de la interfaz de usuario de su aplicación, puede causar resultados inesperados. Por ejemplo, si su aplicación usa varios subprocesos, puede usar el método runOnUiThread () para asegurarse de que su código se ejecute en el subproceso de la interfaz de usuario:

Enlace de referencia de Google

Hamed Jaliliani
fuente
1

Tuve el mismo problema, pero el mío fue debido a una pérdida de memoria de la base de datos de Android. Salteé un cursor. Entonces, el dispositivo se bloquea para solucionar esa pérdida de memoria. Si está trabajando con la base de datos de Android, verifique si omitió un cursor mientras recuperaba datos de la base de datos

amadosi
fuente
No utilicé ninguna base de datos en esa aplicación. Me parece que hay MUCHAS opciones que pueden causar ese error.
tío Lem
1

También me sucedió a mí mientras ejecutaba un juego usando and-engine. Se solucionó después de que agregué el siguiente código a mi manifest.xml. Este código debe agregarse a su actividad principal.

android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|mcc|mnc"
mallik
fuente
1

Yo tuve el mismo problema. Para resolver el error: Ciérrelo en el emulador y luego ejecútelo usando Android Studio.

El error ocurre cuando intenta volver a ejecutar la aplicación cuando ya se está ejecutando en el emulador.

Básicamente, el error dice: "Ya no tengo el canal existente y estoy eliminando la conexión ya establecida", ya que ha ejecutado la aplicación desde Android Studio nuevamente.

Kapil Bhagia
fuente
Cerró el emulador Genymotion. Abrió el emulador de nuevo. Ninguna aplicación se bloquea esta vez :)
Emily Alexandra Conroyd
1

Yo también estaba teniendo el mismo problema. En mi caso fue provocado al intentar reproducir videos con una codificación pobre (demandaba demasiada memoria). Esto me ayudó a detectar el error y solicitar otra versión del mismo video. https://stackoverflow.com/a/11986400/2508527

David Martínez Pérez
fuente
1

En mi caso, estos dos problemas ocurren en algunos casos, como cuando intento mostrar el cuadro de diálogo de progreso en una actividad que no está en primer plano. Entonces, descarto el diálogo de progreso en onPause del ciclo de vida de la actividad. Y el problema está resuelto.

¡No se puede iniciar este animador en una vista separada! revelar efecto ERROR

RESPUESTA: ¡ No se puede iniciar este animador en una vista separada! revelar efecto

¿Por qué recibo un error? ¡El canal está irrecuperablemente roto y se eliminará!

RESPUESTA: Por qué recibo el error "¡El canal está irrecuperablemente roto y se eliminará!"

@Override
protected void onPause() {
    super.onPause();
    dismissProgressDialog();

}

private void dismissProgressDialog() {
    if(progressDialog != null && progressDialog.isShowing())
        progressDialog.dismiss();
}
jazzbpn
fuente
1

Tuve este problema y la causa fue en realidad una NullPointerException. ¡Pero no se me presentó como tal!

mi Salida: la pantalla estuvo atascada durante un período muy largo y ANR

Mi estado: el archivo xml de diseño se incluyó en otro diseño, pero se hizo referencia a la vista incluida sin dar una identificación en el diseño adjunto. (Tenía dos implementaciones más similares de la misma vista secundaria, por lo que la identificación del recurso se creó con el nombre de pila)

Nota: era un diseño de diálogo personalizado, por lo que comprobar los diálogos primero puede ayudar un poco

Conclusión: Se produjo una pérdida de memoria al buscar la identificación de la vista secundaria.

Blue_Alien
fuente
1

Para mí, fue causado por una imagen de la pantalla de presentación que era demasiado grande (más de 4000x2000). El problema desapareció después de reducir sus dimensiones.

Dominique Lorre
fuente
0

Al leer todas las contribuciones, parece que muchos orígenes diferentes presentan los mismos síntomas del problema.

En mi caso, por ejemplo, tuve este problema tan pronto como agregué

android:progressBackgroundTintMode="src_over"

a las propiedades de mi barra de progreso. Creo que el diseñador de GUI de ADT es conocido por varios errores. Por lo tanto, supongo que este es uno de ellos. Entonces, si encuentra síntomas de problemas similares (que simplemente no tienen sentido) después de jugar con la configuración de su GUI, simplemente intente revertir lo que hizo y deshaga sus últimas modificaciones de GUI.

Simplemente presione Ctrl + z con el archivo modificado recientemente en la pantalla.

O:

La herramienta de control de versiones podría resultar útil. Abra el panel Control de versiones: elija la pestaña Cambios locales y vea los archivos modificados recientemente (tal vez .xml).

Haga clic derecho en alguno de los más sospechosos y haga clic en Mostrar diferencia. Luego, adivine qué línea modificada podría ser la responsable.

Buena suerte :)

Agotado
fuente
0

Este error ocurrió en caso de pérdida de memoria. Por ejemplo, si tiene algún contexto estático de un componente de Android (Actividad / servicio / etc.) y el sistema lo mata.

Ejemplo: controles del reproductor de música en el área de notificación. Utilice un servicio de primer plano y establezca acciones en el canal de notificación a través de PendingIntent como se muestra a continuación.

Intent notificationIntent = new Intent(this, MainActivity.class);
        notificationIntent.setAction(AppConstants.ACTION.MAIN_ACTION);
        notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
                notificationIntent, 0);

        Intent previousIntent = new Intent(this, ForegroundService.class);
        previousIntent.setAction(AppConstants.ACTION.PREV_ACTION);
        PendingIntent ppreviousIntent = PendingIntent.getService(this, 0,
                previousIntent, 0);

        Intent playIntent = new Intent(this, ForegroundService.class);
        playIntent.setAction(AppConstants.ACTION.PLAY_ACTION);
        PendingIntent pplayIntent = PendingIntent.getService(this, 0,
                playIntent, 0);

        Intent nextIntent = new Intent(this, ForegroundService.class);
        nextIntent.setAction(AppConstants.ACTION.NEXT_ACTION);

        Bitmap icon = BitmapFactory.decodeResource(getResources(),
                R.drawable.ic_launcher);

        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        String NOTIFICATION_CHANNEL_ID = "my_channel_id_01";

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "My Notifications", NotificationManager.IMPORTANCE_HIGH);

            // Configure the notification channel.
            notificationChannel.setDescription("Channel description");
            notificationChannel.enableLights(true);
            notificationChannel.setLightColor(Color.RED);
            notificationChannel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
            notificationChannel.setVibrationPattern(new long[]{0, 1000, 500, 1000});
            notificationChannel.enableVibration(true);
            notificationManager.createNotificationChannel(notificationChannel);
        }

        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID);
        Notification notification = notificationBuilder
                .setOngoing(true)
                .setAutoCancel(true)
                .setWhen(System.currentTimeMillis())
                .setContentTitle("Foreground Service")
                .setContentText("Foreground Service Running")
                .setSmallIcon(R.drawable.ic_launcher)
                .setLargeIcon(Bitmap.createScaledBitmap(icon, 128, 128, false))
                .setContentIntent(pendingIntent)
                .setPriority(NotificationManager.IMPORTANCE_MAX)
                .setCategory(Notification.CATEGORY_SERVICE)
                .setTicker("Hearty365")
                .build();
        startForeground(AppConstants.NOTIFICATION_ID.FOREGROUND_SERVICE,
                notification);

Y si este canal de notificación se rompe abruptamente (puede ser por sistema, como en los dispositivos Xiomi cuando limpiamos las aplicaciones en segundo plano), entonces, debido a pérdidas de memoria, este error es lanzado por el sistema.

Akki
fuente
Hola, creo que este podría ser mi problema. Veo este error cada vez que cierro mi reproductor multimedia. Creo que limpio todo correctamente, oculto la notificación, anulo el registro de los receptores, etc. Pero recibo este mensaje de todos modos. El comportamiento de la aplicación no se ve afectado, pero me gustaría arreglarlo de todos modos. ¿Qué debo hacer para evitarlo?
JeCh
0

En mi caso, estaba usando la biblioteca Glide y la imagen que se le pasó era nula. Entonces estaba arrojando este error. Pongo un cheque como este:

if (imageData != null) {
    // add value in View here 
}

Y funcionó bien. Espero que esto ayude a alguien.

Adnan Afzal
fuente
0

Recibí el mismo mensaje de logcat, solo me doy cuenta de que el valor string.xml de la matriz no puede ser número / dígito, pero solo se permite texto / alfabeto.

ALBERT ABAS
fuente