Warum ich einen Fehler erhalte 'Kanal ist unwiederbringlich defekt und wird entsorgt!'


104

Wenn ich versuche, meine AndEngine-Aktivität zu starten, wird folgende Fehlermeldung angezeigt :

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

Die App stürzt nicht ab, aber es gibt einen schwarzen Bildschirm und das Gerät reagiert nicht auf das Drücken der Tasten "Zurück" oder "Startseite".

Weiß jemand, wo das Problem liegt?


Aus den von Ihnen angegebenen Informationen lässt sich nicht viel erraten (bitte mehr hinzufügen). Dies kann jedoch hilfreich sein: stackoverflow.com/questions/5551929/inputdispatcher-error Auf Speicherlecks prüfen .
Jong

10
Dieser Fehler wird angezeigt, nachdem eine App abgestürzt ist (oder zwangsweise gestoppt wurde). Der Teil in Android, der Eingabeereignisse (Touchscreen-Drucke usw.) an Ihre App weiterleitet, hat festgestellt, dass das Ziel nicht mehr vorhanden ist. Suchen Sie nach einem Fehler, der vor diesem Fehler auftritt.
Zapl

1
@ Onkel Lem, Bro, auch ich stecke in der gleichen Ausgabe fest. Ich kann keine Operationen ausführen, bis ich das Telefon neu starte. Hast du eine Lösung bekommen? Ich habe
genug von

Antworten:


39

Einer der häufigsten Gründe, warum ich diesen Fehler sehe, ist, wenn ich versuche, einen Warndialog oder einen Fortschrittsdialog in einer Aktivität anzuzeigen, die nicht im Vordergrund steht. Zum Beispiel, wenn ein Hintergrundthread, der ein Dialogfeld anzeigt, in einer angehaltenen Aktivität ausgeführt wird.


2
Setzen Sie den Dialog in onPause auf null und suchen Sie nach null, bevor Sie den Dialog im Hintergrundthread anzeigen.
Lou Morda

In meinem Fall wurde der Fehler angezeigt, weil ich die Methoden onResume (), onStart, onStop, onPause, onDestroy und onLowMemory auskommentiert habe. Danke @LouMorda für den Hinweis!
Maryoomi1

13

Ich denke, dass Sie irgendwo Speicherlecks haben. Tipps zur Vermeidung von Speicherverlusten finden Sie hier . Außerdem können Sie hier mehr über Tools erfahren, mit denen Sie es finden können .


9

Haben Sie einen anderen UI-Thread verwendet? Sie sollten nicht mehr als einen UI-Thread verwenden und ihn wie ein Sandwich aussehen lassen. Dies führt zu Speicherlecks.

Ich habe ein ähnliches Problem vor 2 Tagen gelöst ...

Um es kurz zu machen: Der Hauptthread kann viele UI-Threads haben, um mehrere Arbeiten auszuführen. Wenn sich jedoch ein Sub-Thread mit einem UI-Thread darin befindet, hat der UI-Thread seine Arbeit möglicherweise noch nicht beendet, während der übergeordnete Thread seine bereits beendet hat Arbeit, dies führt zu Speicherlecks.

Zum Beispiel ... für Fragment- und UI-Anwendungen ... führt dies zu Speicherlecks.

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

Meine Lösung ist wie folgt neu zu ordnen:

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

für Sie Referenz.

Ich bin Taiwaner, ich freue mich, hier noch einmal zu antworten.


6

Den Quellcode zu dieser Ausgabe finden Sie hier :

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 ist Ursache durch Zyklus gebrochen gesperrt ...


13
Können Sie näher erläutern, was bedeutet "Zyklus gebrochen gesperrt"?
Jaydev

4

Ich habe einen ähnlichen Fehler erhalten (meine App stürzt ab), nachdem ich etwas in umbenannt strings.xmlund vergessen habe, andere Dateien (eine bevorzugte XML-Ressourcendatei und Java-Code) zu ändern.

IDE (Android Studio) zeigte keine Fehler. Aber nachdem ich meine XML-Dateien und meinen Java-Code repariert hatte, lief die App in Ordnung. Vielleicht gibt es einige kleine Fehler in Ihren XML-Dateien oder Konstanten.


Zu verallgemeinert, um verstanden zu werden :)
Naga

2

Ich hatte das gleiche Problem. Meins war auf ein drittes Glas zurückzuführen, aber der Logcat hat die Ausnahme nicht erkannt. Ich habe das dritte Glas aktualisiert, hoffe, dass dies helfen wird.


1

Ich hatte das gleiche Problem, aber mein Problem war auf ein Speicherleck in der Android-Datenbank zurückzuführen. Ich habe einen Cursor übersprungen. Das Gerät stürzt also ab, um das Speicherleck zu beheben. Wenn Sie mit der Android-Datenbank arbeiten, überprüfen Sie, ob Sie beim Abrufen aus der Datenbank einen Cursor übersprungen haben


Ich habe in dieser App keine Datenbanken verwendet. Mir scheint, dass es viele Optionen gibt, die diesen Fehler verursachen können.
Onkel Lem

1

Das ist mir auch passiert, als ich ein Spiel mit and-engine ausgeführt habe. Es wurde behoben, nachdem ich den folgenden Code zu meiner manifest.xml hinzugefügt hatte. Dieser Code sollte zu Ihrer Hauptaktivität hinzugefügt werden.

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

1

Ich hatte das gleiche Problem. So beheben Sie den Fehler: Schließen Sie ihn auf dem Emulator und führen Sie ihn dann mit Android Studio aus.

Der Fehler tritt auf, wenn Sie versuchen, die App erneut auszuführen, wenn die App bereits auf dem Emulator ausgeführt wird.

Grundsätzlich lautet der Fehler "Ich habe den vorhandenen Kanal nicht mehr und entsorge die bereits hergestellte Verbindung", da Sie die App erneut von Android Studio aus ausgeführt haben.


Der Genymotion-Emulator wurde geschlossen. Öffnete den Emulator erneut. Diesmal stürzt keine App ab :)
Emily Alexandra Conroyd


1

In meinem Fall treten diese beiden Probleme in einigen Fällen auf, z. B. wenn ich versuche, den Fortschrittsdialog in einer Aktivität anzuzeigen, die nicht im Vordergrund steht. Daher schließe ich den Fortschrittsdialog in onPause des Aktivitätslebenszyklus ab. Und das Problem ist behoben.

Dieser Animator kann nicht in einer getrennten Ansicht gestartet werden! Effekt aufdecken BUG

ANTWORT: Dieser Animator kann nicht in einer getrennten Ansicht gestartet werden! Wirkung offenbaren

Warum ich Fehler bekomme Der Kanal ist unwiederbringlich defekt und wird entsorgt!

ANTWORT: Warum ich den Fehler erhalte 'Kanal ist unwiederbringlich defekt und wird entsorgt!'

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

}

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

1

Ich hatte dieses Problem und die Ursache war tatsächlich eine NullPointerException. Aber es wurde mir nicht als eins präsentiert!

Mein Output: Bildschirm blieb sehr lange hängen und ANR

Mein Status: Die Layout-XML-Datei enthielt ein anderes Layout, verwies jedoch auf die enthaltene Ansicht, ohne im angehängten Layout eine ID anzugeben. (Ich hatte zwei weitere ähnliche Implementierungen derselben untergeordneten Ansicht, daher wurde die Ressourcen-ID mit dem angegebenen Namen erstellt.)

Hinweis: Es handelte sich um ein benutzerdefiniertes Dialogfeldlayout. Daher kann es hilfreich sein, zuerst die Dialogfelder zu überprüfen

Schlussfolgerung: Beim Durchsuchen der ID der untergeordneten Ansicht ist ein Speicherverlust aufgetreten.


1

Als ich auf diesen Fehler stieß, wurden Ihre Funktionen oder Bibliotheken, die verwendet wurden, irgendwo in Ihrem Code auf verschiedenen Threads ausgeführt. Versuchen Sie also, den gesamten Code auf demselben Thread aufzurufen. Dadurch wurde mein Problem behoben.

Wenn Sie Methoden in WebView von einem anderen Thread als dem UI-Thread Ihrer App aus aufrufen, kann dies zu unerwarteten Ergebnissen führen. Wenn Ihre App beispielsweise mehrere Threads verwendet, können Sie die runOnUiThread () -Methode verwenden, um sicherzustellen, dass Ihr Code auf dem UI-Thread ausgeführt wird:

Google Referenzlink


1

Für mich wurde es durch ein zu großes Begrüßungsbild (über 4000x2000) verursacht. Das Problem verschwand nach dem Reduzieren seiner Abmessungen.


0

Wenn man alle Beiträge durchliest, sieht es so aus, als ob viele verschiedene Ursprünge dieselben Problemsymptome verursachen.

In meinem Fall zum Beispiel - ich habe dieses Problem bekommen, sobald ich hinzugefügt habe

android:progressBackgroundTintMode="src_over"

zu meinen Fortschrittsbalken-Eigenschaften. Ich denke, der GUI-Designer von ADT ist für mehrere Fehler bekannt. Daher gehe ich davon aus, dass dies einer von ihnen ist. Wenn Sie also nach dem Spielen mit Ihrem GUI-Setup auf ähnliche Problemsymptome stoßen (die einfach keinen Sinn ergeben), versuchen Sie einfach, das, was Sie getan haben, zurückzusetzen und Ihre letzten GUI-Änderungen rückgängig zu machen.

Drücken Sie einfach Strg + Z mit der zuletzt geänderten Datei auf dem Bildschirm.

Oder:

Das Versionskontroll-Tool könnte hilfreich sein. Öffnen Sie die Versionskontrolle - wählen Sie die Registerkarte Lokale Änderungen und sehen Sie sich die zuletzt geänderten (möglicherweise XML-) Dateien an.

Klicken Sie mit der rechten Maustaste auf einen der verdächtigsten und klicken Sie auf Diff anzeigen. Dann raten Sie einfach, welche modifizierte Leitung dafür verantwortlich sein könnte.

Viel Glück :)


0

Dieser Fehler trat im Falle eines Speicherverlusts auf. Zum Beispiel, wenn Sie einen statischen Kontext einer Android-Komponente (Aktivität / Dienst / usw.) haben und diese vom System beendet wird.

Beispiel: Musik-Player-Steuerelemente im Benachrichtigungsbereich. Verwenden Sie einen Vordergrunddienst und legen Sie über PendingIntent wie unten beschrieben Aktionen im Benachrichtigungskanal fest.

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

Und wenn dieser Benachrichtigungskanal abrupt unterbrochen wird (möglicherweise vom System, wie bei Xiomi-Geräten, wenn wir die Hintergrund-Apps bereinigen), wird dieser Fehler aufgrund von Speicherlecks vom System ausgelöst.


Hallo, ich denke das könnte mein Problem sein. Ich sehe diesen Fehler jedes Mal, wenn ich meinen Media Player schließe. Ich denke, ich reinige alles richtig, ich verstecke die Benachrichtigung, hebe die Registrierung von Empfängern auf usw. Aber ich bekomme diese Nachricht trotzdem. Das Anwendungsverhalten ist davon nicht betroffen, aber ich möchte es trotzdem beheben. Was soll ich tun, um dies zu vermeiden?
JeCh

0

In meinem Fall habe ich die Glide-Bibliothek verwendet und das an sie übergebene Bild war null. Also warf es diesen Fehler. Ich habe einen Scheck wie folgt ausgestellt:

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

Und es hat gut funktioniert. Hoffe das hilft jemandem.


0

Ich habe die gleiche Logcat-Nachricht erhalten, stelle nur fest, dass der Wert von string.xml des Arrays nicht Zahl / Ziffer sein kann, sondern nur Text / Alphabet zulässig ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.