Por que estou recebendo um erro 'O canal está irrecuperavelmente quebrado e será descartado!'

104

Quando tento iniciar minha atividade AndEngine , recebo este erro:

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

O aplicativo não trava, mas há uma tela preta e o dispositivo não reage a pressionar os botões 'voltar' ou 'início'.

Alguém sabe qual é o problema?

tio lem
fonte
Não se pode adivinhar muito com as informações que você deu (por favor, adicione mais). Mas isso pode ajudar: stackoverflow.com/questions/5551929/inputdispatcher-error Verifique se há vazamentos de memória.
Jong
10
Esse erro aparece depois que um aplicativo falha (ou é interrompido à força). A parte no Android que encaminha eventos de entrada (pressionamentos de tela sensível ao toque, etc.) para seu aplicativo percebeu que seu destino não está mais lá. Procure um erro que aconteça antes desse.
zapl
1
@ tio Lem, irmão, mesmo eu estou preso no mesmo problema. Não consigo realizar nenhuma operação até reiniciar o telefone. você conseguiu alguma solução? Estou farto deste problema ..
krishnamurthy

Respostas:

39

Um dos motivos mais comuns para ver esse erro é quando tento exibir uma caixa de diálogo de alerta ou de progresso em uma atividade que não está em primeiro plano. Como quando um thread em segundo plano que exibe uma caixa de diálogo está sendo executado em uma atividade pausada.

Lou Morda
fonte
2
Defina a caixa de diálogo como nula em onPause e verifique se há nulo antes de exibir a caixa de diálogo no thread de segundo plano.
Lou Morda
No meu caso, recebi o erro porque comentei os métodos onResume (), onStart, onStop, onPause, onDestroy e onLowMemory. Obrigado @LouMorda pela dica!
Maryoomi1
13

Eu acho que você tem vazamentos de memória em algum lugar. Você pode encontrar dicas para evitar vazamento de memória aqui . Além disso, você pode aprender sobre as ferramentas para rastreá-lo aqui .

Roman Black
fonte
9

Você usou outro thread de interface do usuário? Você não deve usar mais de 1 thread de interface do usuário e fazer com que pareça um sanduíche. Isso causará vazamentos de memória.

Resolvi um problema semelhante há 2 dias ...

Para manter as coisas curtas: O thread principal pode ter muitos threads de IU para fazer vários trabalhos, mas se um sub-thread contendo um thread de IU estiver dentro dele, o thread de IU pode não ter terminado seu trabalho ainda enquanto seu thread pai já terminou seu trabalho, isso causa vazamentos de memória.

Por exemplo ... para o aplicativo Fragment & UI ... isso causará vazamentos de memória.

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

Minha solução é reorganizar conforme abaixo:

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

para você referência.

Eu sou taiwanês, fico feliz em responder aqui mais uma vez.

Jackie_Hung
fonte
6

Você pode ver o código-fonte sobre esta saída aqui :

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

É causa por ciclo quebrado bloqueado ...

codezjx
fonte
13
Você pode explicar, o que significa ciclo quebrado bloqueado?
Jaydev
4

Recebi um erro semelhante (meu aplicativo trava) depois de renomear algo em strings.xml e esqueci de modificar outros arquivos (um arquivo de recurso xml de preferência e código java).

IDE (android studio) não apresentou erros. Mas, depois de reparar meus arquivos xml e código java, o aplicativo funcionou bem. Então, talvez haja alguns pequenos erros em seus arquivos xml ou constantes.

ishitcno1
fonte
Muito generalizado para ser entendido :)
Naga
2

Eu tive o mesmo problema. O meu foi devido a um terceiro jar, mas o logcat não pegou a exceção, resolvi atualizando o terceiro jar, espero que isso ajude.

Yangzx
fonte
2

Como eu enfrentei esse erro, em algum lugar em seu código suas funções ou bibliotecas que eram executadas em threads diferentes, então tente chamar todo o código no mesmo thread, ele corrigiu meu problema.

Se você chamar métodos no WebView a partir de qualquer thread diferente do thread da IU do seu aplicativo, isso pode causar resultados inesperados. Por exemplo, se seu aplicativo usa vários threads, você pode usar o método runOnUiThread () para garantir que seu código seja executado no thread de IU:

Link de referência do Google

Hamed Jaliliani
fonte
1

Eu tive o mesmo problema, mas o meu foi devido a um vazamento de memória do banco de dados do Android. Eu pulei um cursor. Assim, o dispositivo falha para consertar esse vazamento de memória. Se você estiver trabalhando com o banco de dados Android, verifique se você ignorou um cursor ao recuperar do banco de dados

amadosi
fonte
Eu não usei nenhum banco de dados nesse aplicativo. Parece-me que há MUITAS opções que podem causar esse erro.
tio Lem
1

Aconteceu comigo também enquanto rodava um jogo usando o and-engine. Foi corrigido depois de adicionar o código abaixo ao meu manifest.xml. Este código deve ser adicionado à sua atividade principal.

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

Eu tive o mesmo problema. Para resolver o erro: Feche-o no emulador e execute-o usando o Android Studio.

O erro ocorre quando você tenta executar novamente o aplicativo quando o aplicativo já está em execução no emulador.

Basicamente, o erro diz - "Eu não tenho mais o canal existente e descartando a conexão já estabelecida", pois você executou o aplicativo do Android Studio novamente.

Kapil Bhagia
fonte
Fechado o emulador Genymotion. Abriu o emulador novamente. Execute-o. Nenhum app travando desta vez :)
Emily Alexandra Conroyd
1

Eu também estava tendo o mesmo problema. No meu caso foi causado ao tentar reproduzir vídeos com uma codificação pobre (exigia muita memória). Isso me ajudou a detectar o erro e solicitar outra versão do mesmo vídeo. https://stackoverflow.com/a/11986400/2508527

David Martínez Pérez
fonte
1

No meu caso, esses dois problemas ocorrem em alguns casos, como quando estou tentando exibir a caixa de diálogo de progresso em uma atividade que não está em primeiro plano. Então, eu dispenso o diálogo de progresso em onPause do ciclo de vida da atividade. E o problema está resolvido.

Não é possível iniciar este animador em uma vista separada! revelar efeito BUG

RESPOSTA: Não é possível iniciar este animador em uma visualização separada! revelar efeito

Por que estou recebendo o erro 'O canal está irrecuperavelmente quebrado e será descartado!

RESPOSTA: Por que estou recebendo o erro 'O canal está irrecuperavelmente quebrado e será eliminado!'

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

}

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

Eu tive esse problema e a causa foi, na verdade, um NullPointerException. Mas não foi apresentado a mim como um!

minha saída: a tela travou por um longo período e ANR

Meu estado: o arquivo xml de layout foi incluído em outro layout, mas referenciou a visualização incluída sem fornecer id no layout anexado. (eu tinha mais duas implementações semelhantes da mesma visão filha, então o id do recurso foi criado com o nome fornecido)

Observação: era um layout de diálogo personalizado, portanto, verificar os diálogos primeiro pode ajudar um pouco

Conclusão: Ocorreu um vazamento de memória ao pesquisar o id da visualização secundária.

Blue_Alien
fonte
1

Para mim, foi causado por uma imagem da tela inicial que era muito grande (acima de 4000x2000). O problema desapareceu após reduzir suas dimensões.

Dominique Lorre
fonte
0

Lendo todas as contribuições, parece que muitas origens diferentes apresentam os mesmos sintomas de problema.

No meu caso, por exemplo - tive este problema assim que adicionei

android:progressBackgroundTintMode="src_over"

às propriedades da minha barra de progresso. Acho que o designer de GUI do ADT é conhecido por vários bugs. Portanto, presumo que este seja um deles. Portanto, se você encontrar sintomas de problema semelhantes (que simplesmente não fazem sentido) após brincar com a configuração da GUI, tente reverter o que você fez e desfazer as últimas modificações da GUI.

Basta pressionar Ctrl + Z com o arquivo modificado recentemente na tela.

Ou:

A ferramenta de controle de versão pode ser útil. Abra o painel de controle de versão - escolha a guia Alterações locais e veja os arquivos modificados recentemente (talvez .xml).

Clique com o botão direito em alguma das mais suspeitas e clique em Mostrar comparação. Então, adivinhe qual linha modificada pode ser a responsável.

Boa sorte :)

Esgotado
fonte
0

Este erro ocorreu em caso de vazamento de memória. Por exemplo, se você tem qualquer contexto estático de um componente Android (Activity / service / etc) e ele é eliminado pelo sistema.

Exemplo: controles do reprodutor de música na área de notificação. Use um serviço de primeiro plano e defina ações no canal de notificação por meio de PendingIntent como abaixo.

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

E se este canal de notificação for interrompido abruptamente (pode ser pelo sistema, como nos dispositivos Xiomi quando limpamos os aplicativos de fundo), então, devido a vazamentos de memória, esse erro é lançado pelo sistema.

Akki
fonte
Olá, acho que esse pode ser o meu problema. Vejo esse erro sempre que fecho meu reprodutor de mídia. Acho que limpo tudo corretamente, oculto a notificação, cancele o registro de destinatários, etc. Mas recebo esta mensagem mesmo assim. O comportamento do aplicativo não é afetado por isso, mas eu gostaria de corrigi-lo mesmo assim. O que devo fazer para evitar isso?
JeCh
0

No meu caso, eu estava usando a biblioteca Glide e a imagem passada para ela era nula. Então foi lançando esse erro. Eu coloco um cheque assim:

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

E funcionou bem. Espero que isso ajude alguém.

Adnan Afzal
fonte
0

Recebi a mesma mensagem logcat, apenas perceba que o valor string.xml da matriz não pode ser número / dígito, mas apenas texto / alfabeto é permitido.

ALBERT ABAS
fonte