Почему у меня появляется ошибка «Канал неисправно сломан и будет удален!»

110

Когда я пытаюсь запустить свою 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 Проверить на утечки памяти.
Jong
10
Эта ошибка появляется после сбоя приложения (или его принудительной остановки). Часть в Android, которая пересылает события ввода (нажатия на сенсорный экран и т. Д.) В ваше приложение, заметила, что его цели больше нет. Ищите ошибку, которая происходит до этой.
zapl
1
@ дядя Лем, братан, даже я застрял в той же проблеме. Я не могу выполнять какие-либо операции, пока не перезагружу телефон. у тебя было какое-нибудь решение? Мне надоела эта проблема ..
Кришнамурти

Ответы:

41

Одна из наиболее частых причин, по которой я вижу эту ошибку, - это когда я пытаюсь отобразить диалоговое окно с предупреждением или диалоговое окно прогресса в действии, которое не находится на переднем плане. Например, когда фоновый поток, отображающий диалоговое окно, работает в приостановленном действии.

Лу Морда
источник
2
Установите для диалогового окна значение null в onPause и проверьте значение null перед отображением диалогового окна в фоновом потоке.
Лу Морда
В моем случае я получил ошибку, потому что закомментировал методы onResume (), onStart, onStop, onPause, onDestroy и onLowMemory. Спасибо @LouMorda за подсказку!
Maryoomi1
13

Я думаю, что у Вас где-то утечки памяти. Вы можете найти советы , чтобы избежать утечек памяти здесь . Также вы можете узнать об инструментах для его отслеживания здесь .

Роман Блэк
источник
7

Вы использовали другой поток пользовательского интерфейса? Вы не должны использовать более 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;
}

Это потому, что цикл сломан, заблокирован ...

codezjx
источник
14
Не могли бы вы уточнить, что означает «цикл сбой заблокирован»?
Jaydev
4

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

IDE (студия Android) ошибок не показала. Но после того, как я восстановил свои xml-файлы и java-код, приложение заработало нормально. Так что, возможно, в ваших xml файлах или константах есть небольшие ошибки.

ishitcno1
источник
Слишком обобщенный, чтобы его можно было понять :)
Naga
2

У меня такая же проблема. Моя была связана с третьей банкой, но logcat не обнаружил исключения, я решил обновить третью банку, надеюсь, это поможет.

Yangzx
источник
2

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

Если вы вызываете методы в WebView из любого потока, кроме потока пользовательского интерфейса вашего приложения, это может привести к неожиданным результатам. Например, если ваше приложение использует несколько потоков, вы можете использовать метод runOnUiThread (), чтобы обеспечить выполнение вашего кода в потоке пользовательского интерфейса:

Ссылка на Google

Хамед Джалилиани
источник
1

У меня была такая же проблема, но моя была связана с утечкой памяти базы данных Android. Я пропустил курсор. Итак, устройство вылетает, чтобы исправить эту утечку памяти. Если вы работаете с базой данных Android, проверьте, не пропустили ли вы курсор при извлечении из базы данных

Амадози
источник
Я не использовал в этом приложении никаких баз данных. Мне кажется, что есть МНОГО вариантов, которые могут вызвать эту ошибку.
дядя Лем
1

Это случилось и со мной, когда я запускал игру на движке and. Это было исправлено после того, как я добавил приведенный ниже код в свой manifest.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

В моем случае эти две проблемы возникают в некоторых случаях, например, когда я пытаюсь отобразить диалоговое окно прогресса в действии, которое не находится на переднем плане. Итак, я закрываю диалог прогресса в onPause жизненного цикла активности. И вопрос решен.

Невозможно запустить этот аниматор на отдельном виде! выявить эффект BUG

ОТВЕТ: Невозможно запустить этот аниматор на отдельном виде! выявить эффект

Почему у меня возникает ошибка? Канал неисправно сломан и будет удален!

ОТВЕТ: Почему у меня появляется ошибка «Канал неисправимо сломан и будет удален!»

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

}

private void dismissProgressDialog() {
    if(progressDialog != null && progressDialog.isShowing())
        progressDialog.dismiss();
}
jazzbpn
источник
1

У меня была эта проблема, и на самом деле причиной было исключение NullPointerException. Но это не было представлено мне как единое целое!

мой результат: экран зависал на очень долгий период и ANR

Мое состояние: XML-файл макета был включен в другой макет, но ссылался на включенное представление без указания идентификатора в прикрепленном макете. (у меня было еще две похожие реализации одного и того же дочернего представления, поэтому идентификатор ресурса был создан с заданным именем)

Примечание: это был макет настраиваемого диалогового окна, поэтому сначала проверка диалогов может немного помочь

Вывод: при поиске идентификатора дочернего представления произошла утечка памяти.

Blue_Alien
источник
1

Эта ошибка возникла в случае утечки памяти. Например, если у вас есть статический контекст компонента Android (Activity / service / etc), и его убивает система.

Пример: элементы управления музыкальным проигрывателем в области уведомлений. Используйте службу переднего плана и задайте действия в канале уведомлений через 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, когда мы очищаем фоновые приложения), то из-за утечек памяти эта ошибка возникает из-за системы.

Акки
источник
1
Привет, думаю, это моя проблема. Я вижу эту ошибку каждый раз, когда закрываю медиаплеер. Думаю, все чищу правильно, скрываю уведомление, отменяю регистрацию получателей и т. Д. Но это сообщение я все равно получаю. На поведение приложения это не влияет, но все равно хотелось бы исправить. Что мне делать, чтобы этого избежать?
JeCh
@JeCh что-нибудь нашел?
vaibhavS
1

Для меня это было вызвано слишком большим изображением заставки (более 4000x2000). Проблема исчезла после уменьшения его габаритов.

Доминик Лорре
источник
0

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

В моем случае, например - у меня возникла эта проблема, как только я добавил

android:progressBackgroundTintMode="src_over"

к моим свойствам индикатора выполнения. Я думаю, что дизайнер графического интерфейса ADT известен несколькими ошибками. Следовательно, я предполагаю, что это один из них. Поэтому, если вы столкнетесь с похожими симптомами проблемы (которые просто не имеют смысла) после игры с настройкой графического интерфейса, просто попробуйте откатить то, что вы сделали, и отменить последние изменения графического интерфейса.

Просто нажмите Ctrl + z, когда на экране отображается недавно измененный файл.

Или:

Инструмент контроля версий может оказаться полезным. Откройте панель управления версиями - выберите вкладку «Локальные изменения» и просмотрите недавно измененные файлы (возможно .xml).

Щелкните правой кнопкой мыши наиболее подозрительный и выберите Показать разницу. Тогда просто угадайте, какая модифицированная строка может быть причиной.

Удачи :)

Продано
источник
0

В моем случае я использовал библиотеку Glide, и переданное ей изображение было нулевым. Так что это вызывало эту ошибку. Ставлю чек вот так:

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

И все работало нормально. Надеюсь, это кому-то поможет.

Аднан Афзал
источник
0

У меня такое же сообщение logcat, просто поймите, что значение массива string.xml не может быть числом / цифрой, но разрешен только текст / алфавит.

АЛЬБЕРТ АБАС
источник
0

В моем случае эта ошибка возникает из-за того, что я не подключен к firebase firestore, но использует то же самое.

Чтобы устранить проблему, перейдите в Инструменты-> Firebase.

когда на RHS откроется окно, выберите параметры -> Подключить приложение к Firebase -> Добавить Cloud Firestore в свое приложение

Кешав Кумар
источник