Чому я отримую помилку "Канал невблаганно порушений і буде видалений!"


104

Коли я намагаюся запустити свою AndEngine Activity , я отримую цю помилку:

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

Додаток не виходить з ладу, але є чорний екран, і пристрій не реагує на натискання кнопок "назад" або "додому".

Хтось знає, в чому проблема?


Мало що можна здогадатися з наданої вами інформації (Будь ласка, додайте більше). Але це може допомогти: stackoverflow.com/questions/5551929/inputdispatcher-error Перевірка на наявність витоків пам'яті.
Чжон

10
Ця помилка з’являється після збоїв програми (або її призупинено). Частина в Android, яка пересилає події введення (сенсорний екран тощо) у вашу програму, помітила, що її цілі вже немає. Шукайте помилку, яка трапляється до цього.
zapl

1
@uncle Lem, Bro, я навіть застряг у тому самому питанні. Я не можу виконувати жодних операцій, поки не перезавантажую телефон. Ви отримали якесь рішення? Мене
набридає

Відповіді:


39

Однією з найпоширеніших причин, за якою я бачу цю помилку, є те, що я намагаюся відобразити діалог попередження або діалог прогрес у діяльності, яка не на передньому плані. Як, наприклад, коли фонова нитка, що відображає діалогове вікно, працює в паузі.


2
Встановіть діалогове вікно на нуль onPause і перевірте наявність нуля, перш ніж відобразити діалогове вікно у фоновому потоці.
Лу Морда

У моєму випадку я отримав помилку, оскільки я прокоментував методиRRume (), OnStart, onStop, onPause, onDestroy та onLowMemory. Дякую @LouMorda за підказку!
Maryoomi1

13

Я думаю, що у вас десь протікає пам'ять. Ви можете знайти поради , щоб уникнути витоків пам'яті тут . Також ви можете дізнатися про інструменти для їх відстеження тут .


9

Ви використовували інший потік інтерфейсу? Ви не повинні використовувати більше 1 потоку інтерфейсу користувача і зробити його схожим на сендвіч. Це призведе до витоку пам'яті.

Я вирішив подібне питання 2 дні тому ...

Щоб зробити короткий: основний потік може мати багато потоків користувальницького інтерфейсу для виконання декількох робіт, але якщо одна підпотока, що містить нитку інтерфейсу користувача, всередині нього, можливо, поток інтерфейсу ще не закінчив свою роботу, поки його батьківська нитка вже закінчила робота, це спричиняє витік пам'яті.

Наприклад ... для програми Fragment & UI ... це призведе до витоку пам'яті.

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

Моє рішення переставити так:

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

для вас довідка.

Я тайванець, радий ще раз відповісти тут.


6

Ви можете побачити вихідний код цього виводу тут :

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

Це через цикл, порушений заблокований ...


13
Чи можете ви пояснити, що означає порушений цикл блокування?
Jaydev

4

У мене з’явилася аналогічна помилка (аварія мого додатка) після того, як я щось перейменував strings.xmlі забув змінити інші файли (файл переваг xml-ресурсу та java-код).

IDE (android studio) не виявив жодних помилок. Але після того, як я відремонтував свої XML-файли та java-код, додаток працював нормально. Тож, можливо, у ваших xml-файлах чи константах є невеликі помилки.


Занадто узагальнено, щоб зрозуміти, хоча :)
Нага

2

У мене була така ж проблема. Шахта була завдяки третій банці, але logcat не став винятком, і я вирішив оновленням третьої банки, сподіваюсь, це допоможе.


2

Коли я зіткнувся з цією помилкою, десь у вашому коді ваші функції або бібліотеки, які використовувались, працюють на різних потоках, тому спробуйте зателефонувати усім кодом в одній темі, це вирішило мою проблему.

Якщо ви зателефонуєте за методами WebView з будь-якої теми, крім потоку інтерфейсу вашого додатка, це може спричинити несподівані результати. Наприклад, якщо у вашій програмі використовується декілька потоків, ви можете скористатися методом runOnUiThread (), щоб переконатися, що ваш код виконується в потоці інтерфейсу:

Посилання Google


1

У мене була така ж проблема, але моя була через течі пам'яті бази даних Android. Я пропустив курсор. Таким чином, пристрій виходить з ладу, щоб виправити витік пам'яті. Якщо ви працюєте з базою даних Android, перевірте, чи пропустили ви курсор під час отримання з бази даних


Я не використовував баз даних у цьому додатку. Мені здається, що існує багато варіантів, які можуть спричинити цю помилку.
дядько Лем

1

Це трапилося і для мене, коли я працював у грі за допомогою і-engine. Це було виправлено після того, як я додав код нижче до свого маніфесту.xml. Цей код слід додати до вашої основної активності.

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

1

У мене була така ж проблема. Щоб вирішити помилку: закрийте її на емуляторі та запустіть її за допомогою Android Studio.

Помилка трапляється при спробі перезапустити додаток, коли додаток уже працює на емуляторі.

В основному помилка говорить - "У мене вже немає існуючого каналу і розпоряджається вже встановленим з'єднанням", оскільки ви знову запустили додаток з Android Studio.


Закрили емулятор Genymotion. Відкрив емулятор знову. Цього разу жодна програма не
виходить з

1

У мене була така ж проблема. У моєму випадку це було викликано при спробі відтворення відео з поганою кодифікацією (вимагала занадто багато пам'яті). Це допомогло мені зрозуміти помилку та подати запит на іншу версію того ж відео. https://stackoverflow.com/a/11986400/2508527


1

У моєму випадку ці два питання виникають у деяких випадках, наприклад, коли я намагаюся відобразити діалог прогресу в діяльності, яка не на першому плані. Отже, я відхиляю діалог про хід роботи в режимі " Призупинення " життєвого циклу діяльності. І питання вирішено.

Неможливо запустити цього аніматора в окремому вікні! виявити ефект БУГ

ВІДПОВІДЬ: Неможливо запустити цього аніматора на окремому вікні! виявити ефект

Чому я отримую помилку? Канал невблаганно порушений і буде видалений!

ВІДПОВІДЬ: Чому я отримую помилку "Канал невблаганно порушений і буде видалений!"

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

}

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

1

У мене виникла ця проблема, і причиною насправді стало NullPointerException. Але вона не була представлена ​​мені як одна!

мій вихід: екран застряг дуже довго і ANR

Мій стан: у файл xml-макета був включений інший макет, але посилався на включений вид, не вказуючи ідентифікатор у доданому макеті. (у мене було ще дві подібні реалізації одного і того ж дочірнього представлення, тому ідентифікатор ресурсу був створений із заданим іменем)

Примітка. Це був макет користувальницького діалогу, тому спочатку перевірка діалогів може трохи допомогти

Висновок: Під час пошуку ідентифікатора дочірнього перегляду трапилася деяка витік пам'яті.


1

Для мене це було занадто великим (понад 4000 x 2000) зображенням екрану заставки. Проблема зникла після зменшення її розмірів.


0

Читаючи всі внески, схоже, що багато різних джерел викликають цю саму симптоматику.

Наприклад, у моєму випадку - цю проблему я отримав, як тільки додав

android:progressBackgroundTintMode="src_over"

до моїх властивостей панелі прогресу Я думаю, що GUI-дизайнер ADT відомий кількома помилками. Отже, я припускаю, що це одна з них. Отож, якщо ви зіткнулися з подібними симптомами проблеми (які просто не мають сенсу) після гри з вашим налаштуванням GUI, просто спробуйте повернути назад те, що ви зробили, і скасуйте останні зміни GUI.

Просто натисніть Ctrl + z з нещодавно зміненим файлом на екрані.

Або:

Засіб контролю версій може бути корисним. Відкрийте панель керування версіями - виберіть вкладку Локальні зміни та перегляньте нещодавно змінені (можливо .xml) файли.

Клацніть правою кнопкою миші декілька найбільш підозрілих і натисніть Показати різницю. Тоді просто здогадайтесь, яка модифікована лінія може відповідати.

Удачі :)


0

Ця помилка сталася у випадку витоку пам'яті. Наприклад, якщо у вас є будь-який статичний контекст компонента Android (Діяльність / служба / тощо), і його система вбивається.

Приклад: елементи управління музичним плеєром в області сповіщень. Використовуйте послугу переднього плану та встановіть дії на каналі сповіщень через PendingIntent, як показано нижче.

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

І якщо цей канал сповіщень різко порушується (може бути системою, як на пристроях Xiomi, коли ми очищаємо фонові програми), то через витоки пам'яті ця помилка скидається системою.


Привіт, я думаю, це може бути моєю проблемою. Я бачу цю помилку щоразу, коли закриваю медіаплеєр. Я думаю, що все правильно очищаю, приховую сповіщення, відреєстрацію приймачів тощо. Але я все одно отримую це повідомлення. На поведінку програми це не впливає, але я хотів би це все виправити. Що мені робити, щоб уникнути цього?
JeCh

0

У моєму випадку я використовував бібліотеку Glide, і зображення, передане їй, було нульовим. Отож це помилка кинула. Я ставлю чек так:

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

І це спрацювало чудово. Сподіваюся, що це комусь допоможе.


0

Я отримав те саме повідомлення logcat, просто зрозумійте, що значення string.xml масиву не може бути числом / цифрою, але дозволено лише текст / алфавіт.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.