Pourquoi j'obtiens une erreur «Le canal est irrémédiablement endommagé et sera éliminé!


104

Lorsque j'essaye de lancer mon activité AndEngine , j'obtiens cette erreur:

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

L'application ne plante pas, mais il y a un écran noir et l'appareil ne réagit pas en appuyant sur les boutons «retour» ou «accueil».

Quelqu'un sait-il quel est le problème?


Les informations que vous avez fournies ne permettent pas de deviner grand-chose (veuillez en ajouter). Mais cela pourrait aider: stackoverflow.com/questions/5551929/inputdispatcher-error Vérifiez les fuites de mémoire.
Jong

10
Cette erreur apparaît après la panne d'une application (ou l'arrêt forcé). La partie d'Android qui transmet les événements d'entrée (pressions sur l'écran tactile, etc.) à votre application a remarqué que sa cible n'est plus là. Recherchez une erreur qui se produit avant celle-là.
zapl

1
@ oncle Lem, Frère même moi, je suis coincé dans le même problème. Je ne peux effectuer aucune opération avant de redémarrer le téléphone. avez-vous une solution? J'en ai marre de ce problème ..
krishnamurthy

Réponses:


39

L'une des raisons les plus courantes pour lesquelles je vois cette erreur est lorsque j'essaie d'afficher une boîte de dialogue d'alerte ou de progression dans une activité qui n'est pas au premier plan. Comme lorsqu'un thread d'arrière-plan qui affiche une boîte de dialogue s'exécute dans une activité suspendue.


2
Définissez la boîte de dialogue sur null dans onPause et vérifiez la valeur null avant d'afficher la boîte de dialogue dans le thread d'arrière-plan.
Lou Morda

Dans mon cas, j'ai eu l'erreur parce que j'ai commenté les méthodes onResume (), onStart, onStop, onPause, onDestroy et onLowMemory. Merci @LouMorda pour l'indice!
Maryoomi1

13

Je pense que vous avez des fuites de mémoire quelque part. Vous pouvez trouver des conseils pour éviter les fuites de mémoire ici . Vous pouvez également en apprendre davantage sur les outils pour le suivre ici .


9

Avez-vous utilisé un autre thread d'interface utilisateur? Vous ne devez pas utiliser plus d'un fil d'interface utilisateur et le faire ressembler à un sandwich. Cela entraînera des fuites de mémoire.

J'ai résolu un problème similaire il y a 2 jours ...

Pour faire court: le thread principal peut avoir de nombreux threads d'interface utilisateur pour effectuer plusieurs travaux, mais si un sous-thread contenant un thread d'interface utilisateur se trouve à l'intérieur, le thread d'interface utilisateur n'a peut-être pas encore terminé son travail alors que son thread parent a déjà terminé son travail, cela provoque des fuites de mémoire.

Par exemple ... pour l'application Fragment & UI ... cela entraînera des fuites de mémoire.

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

Ma solution est de réorganiser comme ci-dessous:

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

Pour votre référence.

Je suis Taiwanais, je suis heureux de répondre ici une fois de plus.


6

Vous pouvez voir le code source de cette sortie ici :

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

C'est cause par cycle cassé verrouillé ...


13
Pouvez-vous préciser, que signifie cycle cassé verrouillé?
Jaydev

4

J'ai eu une erreur similaire (mon application se bloque) après avoir renommé quelque chose strings.xmlet oublié de modifier d'autres fichiers (un fichier de ressources xml de préférence et un code java).

IDE (android studio) n'a montré aucune erreur. Mais, après avoir réparé mes fichiers xml et mon code java, l'application a bien fonctionné. Alors, peut-être qu'il y a de petites erreurs dans vos fichiers xml ou vos constantes.


Trop généralisé pour être compris :)
Naga

2

J'ai eu le même problème. Le mien était dû à un troisième pot, mais le logcat n'a pas attrapé l'exception, j'ai résolu en mettant à jour le troisième pot, j'espère que cela vous aidera.


2

Lorsque j'ai rencontré cette erreur, quelque part dans votre code, vos fonctions ou bibliothèques qui utilisaient s'exécutaient sur différents threads, alors essayez d'appeler tout le code sur le même thread, cela a résolu mon problème.

Si vous appelez des méthodes sur WebView à partir d'un thread autre que le thread d'interface utilisateur de votre application, cela peut entraîner des résultats inattendus. Par exemple, si votre application utilise plusieurs threads, vous pouvez utiliser la méthode runOnUiThread () pour vous assurer que votre code s'exécute sur le thread d'interface utilisateur:

Lien de référence Google


1

J'ai eu le même problème mais le mien était dû à une fuite de mémoire de base de données Android. J'ai sauté un curseur. Donc, l'appareil plante pour réparer cette fuite de mémoire. Si vous travaillez avec la base de données Android, vérifiez si vous avez sauté un curseur lors de la récupération de la base de données


Je n'ai utilisé aucune base de données dans cette application. Il me semble qu'il existe BEAUCOUP d'options qui peuvent causer cette erreur.
oncle Lem

1

Cela m'est également arrivé lors de l'exécution d'un jeu en utilisant and-engine. Il a été corrigé après avoir ajouté le code ci-dessous à mon manifest.xml. Ce code doit être ajouté à votre activité principale.

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

1

J'ai eu le même problème. Pour résoudre l'erreur: fermez-le sur l'émulateur, puis exécutez-le à l'aide d'Android Studio.

L'erreur se produit lorsque vous essayez de réexécuter l'application alors que l'application est déjà en cours d'exécution sur l'émulateur.

En gros, l'erreur dit: "Je n'ai plus le canal existant et je supprime la connexion déjà établie" car vous avez à nouveau exécuté l'application depuis Android Studio.


Fermé l'émulateur Genymotion. A rouvert l'émulateur. Aucune application ne plante cette fois :)
Emily Alexandra Conroyd


1

Dans mon cas, ces deux problèmes se produisent dans certains cas, comme lorsque j'essaie d'afficher la boîte de dialogue de progression dans une activité qui n'est pas au premier plan. Donc, je ferme la boîte de dialogue de progression dans onPause du cycle de vie de l'activité. Et le problème est résolu.

Impossible de démarrer cet animateur sur une vue détachée! révéler l'effet BUG

REPONSE: Impossible de démarrer cet animateur sur une vue détachée! révéler l'effet

Pourquoi j'obtiens une erreur «Le canal est irrémédiablement cassé et sera éliminé!

REPONSE: Pourquoi j'obtiens une erreur "Le canal est irrémédiablement cassé et sera éliminé!"

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

}

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

1

J'ai eu ce problème et la cause était en fait une NullPointerException. Mais cela ne m'a pas été présenté comme tel!

ma sortie: l'écran est resté bloqué pendant une très longue période et ANR

Mon état: le fichier xml de mise en page a été inclus dans une autre mise en page, mais a référencé la vue incluse sans donner d'identifiant dans la mise en page jointe. (J'ai eu deux implémentations similaires de la même vue enfant, donc l'ID de ressource a été créé avec le nom donné)

Remarque: il s'agissait d'une disposition de boîte de dialogue personnalisée, donc vérifier d'abord les boîtes de dialogue peut aider un peu

Conclusion: une fuite de mémoire s'est produite lors de la recherche de l'ID de la vue enfant.


1

Pour moi, cela a été causé par une image d'écran de démarrage trop grande (plus de 4000x2000). Le problème a disparu après avoir réduit ses dimensions.


0

En lisant toutes les contributions, il semble que de nombreuses origines différentes présentent les mêmes symptômes.

Dans mon cas par exemple - j'ai eu ce problème dès que j'ai ajouté

android:progressBackgroundTintMode="src_over"

aux propriétés de ma barre de progression. Je pense que le concepteur GUI d'ADT est connu pour plusieurs bogues. Par conséquent, je suppose que c'est l'un d'entre eux. Donc, si vous rencontrez des problèmes similaires (qui n'ont tout simplement pas de sens) après avoir joué avec votre configuration GUI, essayez simplement de revenir en arrière et d'annuler vos dernières modifications de l'interface graphique.

Appuyez simplement sur Ctrl + z avec le fichier récemment modifié à l'écran.

Ou:

L'outil de contrôle de version peut être utile. Ouvrez le panneau Contrôle de version - choisissez l'onglet Changements locaux et consultez les fichiers récemment modifiés (peut-être .xml).

Cliquez avec le bouton droit sur l'un des plus suspects et cliquez sur Afficher les différences. Ensuite, devinez quelle ligne modifiée pourrait être responsable.

Bonne chance :)


0

Cette erreur s'est produite en cas de fuite de mémoire. Par exemple, si vous avez un contexte statique d'un composant Android (activité / service / etc) et qu'il est tué par le système.

Exemple: commandes du lecteur de musique dans la zone de notification. Utilisez un service de premier plan et définissez des actions dans le canal de notification via PendingIntent comme ci-dessous.

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

Et si ce canal de notification est brusquement brisé (peut être par le système, comme dans les appareils Xiomi lorsque nous nettoyons les applications d'arrière-plan), alors en raison de fuites de mémoire, cette erreur est générée par le système.


Salut, je pense que cela pourrait être mon problème. Je vois cette erreur chaque fois que je ferme mon lecteur multimédia. Je pense que je nettoie tout correctement, je cache la notification, je désinscris les destinataires, etc. Mais je reçois quand même ce message. Le comportement de l'application n'en est pas affecté, mais j'aimerais quand même le corriger. Que dois-je faire pour l'éviter?
JeCh

0

Dans mon cas, j'utilisais la bibliothèque Glide et l'image qui lui était passée était nulle. Donc, il jetait cette erreur. J'ai mis un chèque comme celui-ci:

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

Et cela a bien fonctionné. J'espère que cela aide quelqu'un.


0

J'ai eu le même message logcat, réalisez simplement que la valeur string.xml du tableau ne peut pas être un nombre / chiffre, mais que seul le texte / alphabet est autorisé.


0

Dans mon cas, cette erreur se produit parce que je ne suis pas connecté à Firebase Firestore mais qu'il utilise le même.

Pour résoudre le problème, accédez à Outils-> Firebase

lorsqu'une fenêtre s'ouvre sur RHS, choisissez les options pour -> Connecter votre application à Firebase -> Ajouter Cloud Firestore à votre application

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.