Perché ricevo l'errore "Il canale è irrimediabilmente danneggiato e verrà eliminato!"


104

Quando provo ad avviare la mia attività AndEngine , ottengo questo errore:

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

L'app non si arresta in modo anomalo, ma è presente una schermata nera e il dispositivo non reagisce alla pressione dei pulsanti "indietro" o "home".

Qualcuno sa quale sia il problema?


Non si può intuire molto dalle informazioni che hai fornito (aggiungine altre). Ma questo potrebbe aiutare: stackoverflow.com/questions/5551929/inputdispatcher-error Verifica la presenza di perdite di memoria.
Jong

10
Questo errore si verifica dopo che un'app si è arrestata in modo anomalo (o è stata interrotta forzatamente). La parte in Android che inoltra gli eventi di input (pressioni del touchscreen, ecc.) Alla tua app ha notato che il suo obiettivo non è più lì. Cerca un errore che si verifica prima di quello.
zapl

1
@ zio Lem, fratello anche io sono bloccato nello stesso problema. Non posso eseguire alcuna operazione finché non riavvio il telefono. hai avuto qualche soluzione? Sono stufo di questo problema ..
krishnamurthy

Risposte:


39

Uno dei motivi più comuni per cui vedo l'errore è quando cerco di visualizzare una finestra di dialogo di avviso o una finestra di avanzamento in un'attività che non è in primo piano. Come quando un thread in background che visualizza una finestra di dialogo è in esecuzione in un'attività sospesa.


2
Impostare la finestra di dialogo su null in onPause e verificare la presenza di null prima di visualizzare la finestra di dialogo nel thread in background.
Lou Morda

Nel mio caso ho ricevuto l'errore perché ho commentato i metodi Resume (), onStart, onStop, onPause, onDestroy e onLowMemory. Grazie @LouMorda per il suggerimento!
Maryoomi1

13

Penso che tu abbia perdite di memoria da qualche parte. Puoi trovare suggerimenti per evitare perdite di memoria qui . Inoltre puoi conoscere gli strumenti per rintracciarlo qui .


9

Hai usato un altro thread dell'interfaccia utente? Non dovresti usare più di 1 thread dell'interfaccia utente e farlo sembrare un sandwich. Ciò causerà perdite di memoria.

Ho risolto un problema simile 2 giorni fa ...

Per essere brevi: il thread principale può avere molti thread dell'interfaccia utente per eseguire più lavori, ma se al suo interno è presente un thread secondario contenente un thread dell'interfaccia utente, il thread dell'interfaccia utente potrebbe non aver ancora terminato il suo lavoro mentre il thread padre ha già terminato il suo lavoro, questo causa perdite di memoria.

Ad esempio ... per l'applicazione Fragment & UI ... questo causerà perdite di memoria.

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

La mia soluzione è riorganizzare come di seguito:

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

per riferimento.

Sono taiwanese, sono lieto di rispondere ancora una volta.


6

Puoi vedere il codice sorgente di questo output qui :

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 di ciclo rotto bloccato ...


13
Puoi spiegarci cosa significa ciclo rotto bloccato?
Jaydev

4

Ho ricevuto un errore simile (la mia app si arresta in modo anomalo) dopo aver rinominato qualcosa in strings.xml e dimenticato di modificare altri file (un file di risorse xml di preferenza e codice java).

IDE (Android Studio) non ha mostrato errori. Ma, dopo aver riparato i miei file xml e il codice java, l'app ha funzionato bene. Quindi, forse ci sono alcuni piccoli errori nei file xml o nelle costanti.


Troppo generalizzato per essere compreso però :)
Naga

2

Ho avuto lo stesso problema. Il mio era dovuto a un terzo jar, ma il logcat non ha rilevato l'eccezione, ho risolto aggiornando il terzo jar, spero che questi possano aiutare.


2

Quando ho affrontato questo errore, da qualche parte nel tuo codice le tue funzioni o librerie che utilizzavano vengono eseguite su thread diversi, quindi prova a chiamare tutto il codice sullo stesso thread, ha risolto il mio problema.

Se chiami metodi su WebView da qualsiasi thread diverso dal thread dell'interfaccia utente della tua app, può causare risultati imprevisti. Ad esempio, se la tua app usa più thread, puoi usare il metodo runOnUiThread () per assicurarti che il tuo codice venga eseguito sul thread dell'interfaccia utente:

Link di riferimento di Google


1

Ho avuto lo stesso problema ma il mio era dovuto a una perdita di memoria del database Android. Ho saltato un cursore. Quindi il dispositivo si arresta in modo anomalo per riparare quella perdita di memoria. Se stai lavorando con il database Android controlla se hai saltato un cursore durante il recupero dal database


Non ho utilizzato database in quell'app. Mi sembra che ci siano molte opzioni che possono causare quell'errore.
zio Lem,

1

È successo anche a me mentre eseguivo un gioco usando and-engine. È stato risolto dopo aver aggiunto il codice seguente al mio manifest.xml. Questo codice dovrebbe essere aggiunto alla tua attività principale.

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

1

Ho avuto lo stesso problema. Per risolvere l'errore: chiudilo sull'emulatore e quindi eseguilo utilizzando Android Studio.

L'errore si verifica quando si tenta di rieseguire l'app quando l'app è già in esecuzione sull'emulatore.

Fondamentalmente l'errore dice: "Non ho più il canale esistente e sto eliminando la connessione già stabilita" poiché hai eseguito nuovamente l'app da Android Studio.


Chiuso l'emulatore Genmony. Ha riaperto l'emulatore. Nessuna app che si blocca questa volta :)
Emily Alexandra Conroyd


1

Nel mio caso, questi due problemi si verificano in alcuni casi, come quando cerco di visualizzare la finestra di dialogo di avanzamento in un'attività che non è in primo piano. Quindi, chiudo la finestra di dialogo di avanzamento in onPause of the activity lifecycle. E il problema è risolto.

Impossibile avviare questo animatore in una vista separata! rivelare effetto BUG

RISPOSTA: Impossibile avviare questo animatore in una vista separata! rivelare l'effetto

Perché ricevo un errore? Il canale è irrimediabilmente danneggiato e verrà eliminato!

RISPOSTA: Perché ricevo l'errore "Il canale è irrimediabilmente danneggiato e verrà eliminato!"

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

}

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

1

Ho avuto questo problema e la causa era in realtà una NullPointerException. Ma non mi è stato presentato come uno!

il mio output: lo schermo è rimasto bloccato per un periodo molto lungo e ANR

Il mio stato: il file xml del layout è stato incluso in un altro layout, ma ha fatto riferimento alla vista inclusa senza fornire l'ID nel layout allegato. (avevo altre due implementazioni simili della stessa vista figlio, quindi l'ID risorsa è stato creato con il nome dato)

Nota: era un layout di dialogo personalizzato, quindi controllare prima le finestre di dialogo potrebbe aiutare un po '

Conclusione: si è verificata una perdita di memoria durante la ricerca dell'ID della visualizzazione figlio.


1

Per me è stato causato da un'immagine della schermata iniziale troppo grande (oltre 4000x2000). Il problema è scomparso riducendo le sue dimensioni.


0

Leggendo tutti i contributi, sembra che molte esposizioni di origini diverse causino gli stessi sintomi del problema.

Nel mio caso, ad esempio, ho riscontrato questo problema non appena ho aggiunto

android:progressBackgroundTintMode="src_over"

alle proprietà della barra di avanzamento. Penso che il progettista della GUI di ADT sia noto per diversi bug. Quindi presumo che questo sia uno di loro. Quindi, se riscontri sintomi di problemi simili (che semplicemente non hanno senso) dopo aver giocato con la configurazione della tua GUI, prova a ripristinare ciò che hai fatto e annullare le ultime modifiche alla GUI.

Basta premere Ctrl + z con il file modificato di recente sullo schermo.

O:

Lo strumento di controllo della versione potrebbe essere utile. Apri il pannello Controllo versione: scegli la scheda Modifiche locali e visualizza i file modificati di recente (forse .xml).

Fai clic con il pulsante destro del mouse su uno più sospetto e fai clic su Mostra confronto. Quindi indovina quale riga modificata potrebbe essere responsabile.

In bocca al lupo :)


0

Questo errore si è verificato in caso di perdita di memoria. Ad esempio, se hai un contesto statico di un componente Android (attività / servizio / ecc.) E viene ucciso dal sistema.

Esempio: controlli del lettore musicale nell'area di notifica. Utilizza un servizio in primo piano e imposta le azioni nel canale di notifica tramite PendingIntent come di seguito.

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 questo canale di notifica viene interrotto bruscamente (potrebbe essere dal sistema, come nei dispositivi Xiomi quando puliamo le app in background), a causa di perdite di memoria questo errore viene generato dal sistema.


Ciao, penso che questo potrebbe essere il mio problema. Vedo questo errore ogni volta che chiudo il mio lettore multimediale. Penso di pulire tutto correttamente, nascondere la notifica, annullare la registrazione dei destinatari ecc. Ma ricevo comunque questo messaggio. Il comportamento dell'applicazione non ne è influenzato, ma vorrei risolverlo comunque. Cosa devo fare per evitarlo?
JeCh

0

Nel mio caso, stavo usando la libreria Glide e l'immagine passata era nulla. Quindi stava lanciando questo errore. Ho messo un assegno come questo:

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

E ha funzionato bene. Spero che questo aiuti qualcuno.


0

Ho ricevuto lo stesso messaggio logcat, mi rendo conto che il valore string.xml dell'array non può essere numero / cifra, ma è consentito solo testo / alfabeto.


0

Nel mio caso questo errore si sta verificando a causa del mancato collegamento a Firebase Firestore ma utilizzo dello stesso.

Per risolvere il problema, vai su Strumenti-> Firebase

quando si aprirà una finestra su RHS, scegli le opzioni -> Connetti la tua app a Firebase -> Aggiungi Cloud Firestore alla tua app

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.