Dlaczego otrzymuję błąd „Kanał jest nieodwracalnie uszkodzony i zostanie usunięty!”


104

Kiedy próbuję uruchomić moją aktywność AndEngine , pojawia się ten błąd:

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

Aplikacja nie ulega awarii, ale jest czarny ekran, a urządzenie nie reaguje na naciśnięcie przycisku „Wstecz” lub „Dom”.

Czy ktoś wie na czym polega problem?


Niewiele można się domyślić z podanych informacji (dodaj więcej). Ale to może pomóc: stackoverflow.com/questions/5551929/inputdispatcher-error Sprawdź, czy nie ma wycieków pamięci.
Jong

10
Ten błąd pojawia się, gdy aplikacja uległa awarii (lub została zatrzymana na siłę). Część systemu Android, która przekazuje zdarzenia wejściowe (naciśnięcia ekranu dotykowego itp.) Do Twojej aplikacji, zauważyła, że ​​jej celu już nie ma. Poszukaj błędu, który występuje przed tym.
zapl

1
@ wujek Lem, stary, nawet ja utknąłem w tym samym numerze. Nie mogę wykonywać żadnych operacji, dopóki nie uruchomię ponownie telefonu. czy masz jakieś rozwiązanie? Mam dość tego problemu ...
krishnamurthy

Odpowiedzi:


39

Jednym z najczęstszych powodów, dla których widzę ten błąd, jest próba wyświetlenia okna dialogowego ostrzeżenia lub okna postępu w działaniu, które nie jest na pierwszym planie. Tak jak wtedy, gdy wątek w tle, który wyświetla okno dialogowe, działa w wstrzymanym działaniu.


2
Ustaw okno dialogowe na null w onPause i sprawdź, czy nie ma wartości null, zanim wyświetlisz okno dialogowe w wątku w tle.
Lou Morda

W moim przypadku wystąpił błąd, ponieważ wykomentowałem metody onResume (), onStart, onStop, onPause, onDestroy i onLowMemory. Dziękuję @LouMorda za podpowiedź!
Maryoomi 1

13

Myślę, że masz gdzieś przecieki pamięci. Można znaleźć wskazówki, aby uniknąć wyciek pamięci tutaj . Możesz również dowiedzieć się o narzędziach do śledzenia tutaj .


9

Czy użyłeś innego wątku interfejsu użytkownika? Nie powinieneś używać więcej niż 1 wątku interfejsu użytkownika i nadawać mu wygląd kanapki. Może to spowodować wycieki pamięci.

Podobny problem rozwiązałem 2 dni temu ...

Krótko mówiąc: główny wątek może mieć wiele wątków interfejsu użytkownika do wykonywania wielu prac, ale jeśli jeden wątek podrzędny zawierający wątek interfejsu użytkownika znajduje się w nim, wątek interfejsu użytkownika mógł jeszcze nie zakończyć pracy, podczas gdy jego wątek nadrzędny już zakończył pracy, powoduje to wycieki pamięci.

Na przykład ... dla aplikacji Fragment & UI ... spowoduje to wycieki pamięci.

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

Moje rozwiązanie jest uporządkowane jak poniżej:

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

dla ciebie odniesienia.

Jestem Tajwańczykiem, cieszę się, że mogę tu jeszcze raz odpowiedzieć.


6

Możesz zobaczyć kod źródłowy tego wyjścia tutaj :

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

Jest to spowodowane zerwanym cyklem zablokowanym ...


13
Czy możesz wyjaśnić, co oznacza zepsuty cykl zamknięty?
Jaydev

4

Mam podobny błąd (moja aplikacja się zawiesza) po zmianie nazwy czegoś w programie strings.xmli zapomnieniu o zmodyfikowaniu innych plików (plik zasobów xml preferencji i kod java).

IDE (Android Studio) nie pokazało żadnych błędów. Ale po naprawieniu plików xml i kodu java aplikacja działała poprawnie. Więc może są jakieś małe błędy w twoich plikach xml lub stałych.


Zbyt uogólnione, aby je zrozumieć :)
Naga

2

Miałem ten sam problem. Mój był spowodowany trzecim słoikiem, ale logcat nie złapał wyjątku, rozwiązałem, aktualizując trzeci słoik, mam nadzieję, że to pomoże.


2

Kiedy napotkałem ten błąd, gdzieś w twoim kodzie twoje funkcje lub biblioteki, które używały, działają w różnych wątkach, więc spróbuj wywołać cały kod w tym samym wątku, rozwiązało to mój problem.

Jeśli wywołasz metody w WebView z dowolnego wątku innego niż wątek interfejsu użytkownika aplikacji, może to spowodować nieoczekiwane wyniki. Na przykład, jeśli Twoja aplikacja używa wielu wątków, możesz użyć metody runOnUiThread (), aby zapewnić wykonanie kodu w wątku interfejsu użytkownika:

Link referencyjny Google


1

Miałem ten sam problem, ale mój był z powodu wycieku pamięci bazy danych Androida. Pominąłem kursor. Więc urządzenie ulega awarii, aby naprawić ten wyciek pamięci. Jeśli pracujesz z bazą danych systemu Android, sprawdź, czy nie pominąłeś kursora podczas pobierania z bazy danych


Nie korzystałem z żadnych baz danych w tej aplikacji. Wydaje mi się, że istnieje wiele opcji, które mogą powodować ten błąd.
wujek Lem

1

Zdarzyło mi się to również podczas uruchamiania gry na silniku i. Zostało to naprawione po dodaniu poniższego kodu do mojego pliku manifest.xml. Ten kod należy dodać do głównej aktywności.

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

1

Miałem ten sam problem. Aby rozwiązać problem: Zamknij go w emulatorze, a następnie uruchom go za pomocą Android Studio.

Błąd występuje podczas próby ponownego uruchomienia aplikacji, gdy aplikacja jest już uruchomiona w emulatorze.

Zasadniczo błąd mówi - „Nie mam już istniejącego kanału i usuwam już ustanowione połączenie”, ponieważ ponownie uruchomiłeś aplikację z Android Studio.


Zamknięto emulator Genymotion. Ponownie otworzyłem emulator i przeprowadź jego skanowanie. Tym razem żadna aplikacja się nie
zawiesiła


1

W moim przypadku te dwa problemy występują w niektórych przypadkach, na przykład gdy próbuję wyświetlić okno dialogowe postępu w działaniu, które nie jest na pierwszym planie. Dlatego odrzucam okno dialogowe postępu w odrzucam onPause cyklu życia działania. I problem został rozwiązany.

Nie można uruchomić tego animatora w odłączonym widoku! efekt ujawnienia BŁĄD

ODPOWIEDŹ: Nie można uruchomić tego animatora w odłączonym widoku! efekt ujawnienia

Dlaczego otrzymuję błąd? Kanał jest nieodwracalnie uszkodzony i zostanie usunięty!

ODPOWIEDŹ: Dlaczego otrzymuję błąd „Kanał jest nieodwracalnie uszkodzony i zostanie usunięty!”

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

}

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

1

Miałem ten problem, a przyczyną był w rzeczywistości wyjątek NullPointerException. Ale nie został mi przedstawiony jako jeden!

mój wynik: ekran utknął na bardzo długi czas i błąd ANR

Mój stan: plik XML układu zawiera inny układ, ale odwołuje się do dołączonego widoku bez podawania identyfikatora w załączonym układzie. (miałem jeszcze dwie podobne implementacje tego samego widoku podrzędnego, więc identyfikator zasobu został utworzony z podaną nazwą)

Uwaga: był to układ niestandardowego okna dialogowego, więc sprawdzenie najpierw okien dialogowych może trochę pomóc

Wniosek: podczas wyszukiwania identyfikatora widoku potomnego doszło do wycieku pamięci.


1

U mnie było to spowodowane zbyt dużym obrazem na ekranie powitalnym (ponad 4000x2000). Problem zniknął po zmniejszeniu jego wymiarów.


0

Czytając wszystkie wypowiedzi, wygląda na to, że wiele różnych źródeł wykazuje te same objawy problemu.

Na przykład w moim przypadku - problem pojawił się, gdy tylko dodałem

android:progressBackgroundTintMode="src_over"

do właściwości mojego paska postępu. Myślę, że projektant GUI w ADT jest znany z kilku błędów. Dlatego zakładam, że jest to jeden z nich. Więc jeśli napotkasz podobne symptomy problemu (które po prostu nie mają sensu) po zabawie z konfiguracją GUI, po prostu spróbuj cofnąć to, co zrobiłeś i cofnąć ostatnie modyfikacje GUI.

Po prostu naciśnij Ctrl + Z po wyświetleniu ostatnio zmodyfikowanego pliku na ekranie.

Lub:

Pomocne może być narzędzie kontroli wersji. Otwórz panel Kontrola wersji - wybierz zakładkę Zmiany lokalne i zobacz ostatnio zmodyfikowane pliki (np. Xml).

Kliknij prawym przyciskiem myszy jedną z najbardziej podejrzanych i kliknij Pokaż różnicę. Następnie zgadnij, która zmodyfikowana linia może być odpowiedzialna.

Powodzenia :)


0

Ten błąd wystąpił w przypadku wycieku pamięci. Na przykład, jeśli masz jakiś statyczny kontekst komponentu Androida (aktywność / usługa / itp.) I zostanie on zabity przez system.

Przykład: sterowanie odtwarzaczem muzyki w obszarze powiadomień. Użyj usługi pierwszego planu i ustaw akcje w kanale powiadomień za pośrednictwem PendingIntent, jak poniżej.

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

A jeśli ten kanał powiadomień zostanie nagle uszkodzony (może to być przez system, jak w urządzeniach Xiomi, kiedy czyścimy aplikacje w tle), to z powodu wycieków pamięci ten błąd jest generowany przez system.


Cześć, myślę, że to może być mój problem. Widzę ten błąd za każdym razem, gdy zamykam odtwarzacz multimedialny. Myślę, że wszystko wyczyściłem poprawnie, ukrywam powiadomienia, wyrejestrowuję odbiorniki itp. Ale i tak otrzymuję ten komunikat. Nie ma to wpływu na zachowanie aplikacji, ale i tak chciałbym to naprawić. Co powinienem zrobić, aby tego uniknąć?
JeCh

0

W moim przypadku korzystałem z biblioteki Glide i przesłany do niej obraz był zerowy. Więc rzucał ten błąd. Wystawiam czek w ten sposób:

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

I działało dobrze. Mam nadzieję, że to komuś pomoże.


0

Otrzymałem ten sam komunikat logcat, po prostu zdaj sobie sprawę, że wartość string.xml tablicy nie może być liczbą / cyfrą, ale dozwolony jest tylko tekst / alfabet.


0

W moim przypadku ten błąd występuje, ponieważ nie jest połączony z Firebase Firestore, ale używa tego samego.

Aby rozwiązać ten problem, przejdź do Narzędzia-> Firebase

kiedy okno otworzy się na RHS wybierz opcje -> Połącz swoją aplikację z Firebase -> Dodaj Cloud Firestore do swojej aplikacji

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.