Mengapa Saya Mendapat Kesalahan 'Saluran rusak dan akan dibuang!'

104

Ketika saya mencoba meluncurkan Aktivitas AndEngine saya , saya mendapatkan kesalahan ini:

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

Aplikasi tidak macet, tetapi ada layar hitam dan perangkat tidak bereaksi untuk menekan tombol 'kembali' atau 'rumah'.

Apakah ada yang tahu apa masalahnya?

paman Lem
sumber
Tidak banyak yang bisa ditebak dari informasi yang Anda berikan (Mohon tambahkan lagi). Tetapi ini mungkin membantu: stackoverflow.com/questions/5551929/inputdispatcher-error Periksa kebocoran memori.
Jong
10
Kesalahan itu muncul setelah aplikasi mogok (atau dihentikan paksa). Bagian di Android yang meneruskan peristiwa input (penekanan layar sentuh, dll.) Ke aplikasi Anda telah memperhatikan bahwa targetnya sudah tidak ada lagi. Cari kesalahan yang terjadi sebelum itu.
zapl
1
@uncle Lem, Bro bahkan saya terjebak dalam masalah yang sama. Saya tidak dapat melakukan operasi apa pun sampai saya me-reboot ponsel. apakah kamu mendapatkan solusi? Saya muak dengan masalah ini ..
krishnamurthy

Jawaban:

39

Salah satu alasan paling umum saya melihat kesalahan itu adalah ketika saya mencoba menampilkan dialog peringatan atau dialog kemajuan dalam aktivitas yang tidak ada di latar depan. Seperti saat utas latar belakang yang menampilkan kotak dialog sedang berjalan dalam aktivitas yang dijeda.

Lou Morda
sumber
2
Setel dialog ke null di onPause, dan periksa null sebelum Anda menampilkan dialog di thread latar belakang.
Lou Morda
Dalam kasus saya, saya mendapat kesalahan karena saya mengomentari metode onResume (), onStart, onStop, onPause, onDestroy, dan onLowMemory. Terima kasih @LouMorda atas petunjuknya!
Maryoomi1
13

Saya pikir Anda memiliki kebocoran memori di suatu tempat. Anda dapat menemukan tip untuk menghindari kebocoran memori di sini . Anda juga dapat mempelajari tentang alat untuk melacaknya di sini .

Roman Hitam
sumber
9

Sudahkah Anda menggunakan utas UI lain? Anda tidak boleh menggunakan lebih dari 1 utas UI dan membuatnya terlihat seperti sandwich. Melakukan ini akan menyebabkan kebocoran memori.

Saya telah memecahkan masalah serupa 2 hari yang lalu ...

Singkatnya: Utas utama dapat memiliki banyak utas UI untuk melakukan banyak pekerjaan, tetapi jika satu sub-utas yang berisi utas UI ada di dalamnya, utas UI mungkin belum menyelesaikan pekerjaannya sementara utas induknya telah menyelesaikannya bekerja, ini menyebabkan kebocoran memori.

Misalnya ... untuk aplikasi Fragment & UI ... ini akan menyebabkan kebocoran memori.

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

Solusi saya adalah mengatur ulang seperti di bawah ini:

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

untuk referensi Anda.

Saya orang Taiwan, dengan senang hati saya menjawab di sini sekali lagi.

Jackie_Hung
sumber
6

Anda dapat melihat kode sumber tentang keluaran ini di sini :

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

Itu karena siklus rusak terkunci ...

codezjx
sumber
13
Bisakah Anda menjelaskan, apa artinya siklus rusak terkunci?
Jaydev
4

Saya mendapat kesalahan serupa (aplikasi saya mogok) setelah saya mengganti nama sesuatu di strings.xml dan lupa memodifikasi file lain (file sumber daya preferensi xml dan kode java).

IDE (studio android) tidak menunjukkan kesalahan apa pun. Tapi, setelah saya memperbaiki file xml dan kode java saya, aplikasi berjalan dengan baik. Jadi, mungkin ada beberapa kesalahan kecil dalam file xml atau konstanta Anda.

ishitcno1
sumber
Terlalu digeneralisasikan untuk dipahami :)
Naga
2

Saya memiliki masalah yang sama. Milik saya karena toples ketiga, tetapi logcat tidak menangkap pengecualian, saya menyelesaikannya dengan memperbarui toples ketiga, semoga ini akan membantu.

yangzx
sumber
2

Ketika saya menghadapi kesalahan ini, di suatu tempat di kode Anda funcs atau perpustakaan Anda yang digunakan berjalan di utas yang berbeda, jadi coba panggil semua kode di utas yang sama, itu memperbaiki masalah saya.

Jika Anda memanggil metode di WebView dari thread apa pun selain thread UI aplikasi Anda, ini bisa menyebabkan hasil yang tidak diharapkan. Misalnya, jika aplikasi Anda menggunakan beberapa utas, Anda bisa menggunakan metode runOnUiThread () untuk memastikan kode Anda dieksekusi pada utas UI:

Tautan referensi Google

Hamed Jaliliani
sumber
1

Saya memiliki masalah yang sama tetapi masalah saya adalah Karena kebocoran memori database Android. Saya melewatkan kursor. Jadi perangkat macet untuk memperbaiki kebocoran memori itu. Jika Anda bekerja dengan database Android, periksa apakah Anda melewatkan kursor saat mengambil dari database

amadosi
sumber
Saya tidak menggunakan database di aplikasi itu. Menurut saya ada BANYAK opsi yang dapat menyebabkan kesalahan itu.
paman Lem
1

Itu terjadi pada saya juga saat menjalankan game menggunakan and-engine. Itu diperbaiki setelah saya menambahkan kode di bawah ini ke manifest.xml saya. Kode ini harus ditambahkan ke aktivitas utama Anda.

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

Saya memiliki masalah yang sama. Untuk mengatasi error: Tutup di emulator lalu jalankan menggunakan Android Studio.

Error ini terjadi saat Anda mencoba menjalankan kembali aplikasi saat aplikasi sudah berjalan di emulator.

Pada dasarnya kesalahan mengatakan - "Saya tidak memiliki saluran yang ada lagi dan membuang koneksi yang sudah ada" karena Anda telah menjalankan aplikasi dari Android Studio lagi.

Kapil Bhagia
sumber
Tutup emulator Genymotion. Buka emulator lagi. Jalankan. Tidak ada aplikasi yang mogok saat ini :)
Emily Alexandra Conroyd
1

Saya juga mengalami masalah yang sama. Dalam kasus saya disebabkan ketika mencoba mereproduksi video dengan kodifikasi yang buruk (menuntut terlalu banyak memori). Ini membantu saya untuk menangkap kesalahan dan meminta versi lain dari video yang sama. https://stackoverflow.com/a/11986400/2508527

David Martínez Pérez
sumber
1

Dalam kasus saya, kedua masalah ini terjadi dalam beberapa kasus seperti ketika saya mencoba menampilkan dialog kemajuan dalam aktivitas yang tidak ada di latar depan. Jadi, saya menutup dialog kemajuan di onPause dari siklus hidup aktivitas. Dan masalahnya teratasi.

Tidak dapat memulai animator ini pada tampilan terpisah! mengungkapkan efek BUG

JAWABAN: Tidak dapat menjalankan animator ini pada tampilan terpisah! mengungkapkan efek

Mengapa Saya Mendapat Kesalahan 'Saluran rusak dan tidak dapat dipulihkan lagi dan akan dibuang!

JAWABAN: Mengapa Saya Mendapat Kesalahan 'Saluran rusak dan akan dibuang!'

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

}

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

Saya mengalami masalah ini dan penyebabnya sebenarnya adalah NullPointerException. Tapi itu tidak disajikan kepada saya sebagai satu!

Output saya: layar macet untuk waktu yang sangat lama dan ANR

Status Saya: file layout xml disertakan dengan layout lain, tetapi mereferensikan tampilan yang disertakan tanpa memberikan id dalam layout terlampir. (saya memiliki dua implementasi yang lebih mirip dari tampilan anak yang sama, jadi id sumber daya dibuat dengan nama yang diberikan)

Catatan: ini adalah tata letak Dialog Kustom, jadi memeriksa dialog terlebih dahulu mungkin sedikit membantu

Kesimpulan: Ada beberapa kebocoran memori yang terjadi saat mencari id tampilan anak.

Blue_Alien
sumber
1

Bagi saya hal itu disebabkan oleh gambar splash screen yang terlalu besar (di atas 4000x2000). Masalahnya hilang setelah mengurangi dimensinya.

Dominique Lorre
sumber
0

Membaca semua kontribusi, sepertinya banyak pameran asal yang berbeda menyebabkan gejala masalah yang sama ini.

Dalam kasus saya misalnya - saya mendapat masalah ini segera setelah saya menambahkan

android:progressBackgroundTintMode="src_over"

ke properti bilah kemajuan saya. Menurut saya, perancang GUI ADT dikenal karena beberapa bug. Karenanya saya menganggap ini adalah salah satunya. Jadi jika Anda mengalami gejala masalah serupa (yang tidak masuk akal) setelah bermain dengan pengaturan GUI Anda, coba putar kembali apa yang Anda lakukan dan batalkan modifikasi GUI terakhir Anda.

Cukup tekan Ctrl + z dengan file yang baru saja diubah di layar.

Atau:

Alat Kontrol Versi dapat membantu. Buka panel Version Control - pilih tab Local Changes dan lihat file yang baru saja diubah (mungkin .xml).

Klik kanan beberapa yang paling mencurigakan dan klik Show Diff. Kemudian tebak saja baris modifikasi mana yang bertanggung jawab.

Semoga berhasil :)

Habis terjual
sumber
0

Kesalahan ini terjadi jika terjadi kebocoran memori. Misalnya jika Anda memiliki konteks statis dari komponen Android (Activity / service / etc) dan dimatikan oleh sistem.

Contoh: Kontrol pemutar musik di area notifikasi. Gunakan layanan latar depan dan setel tindakan di saluran notifikasi melalui PendingIntent seperti di bawah ini.

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

Dan jika saluran notifikasi ini tiba-tiba rusak (mungkin oleh sistem, seperti di perangkat Xiomi saat kami membersihkan aplikasi latar belakang), maka karena kebocoran memori, kesalahan ini dilemparkan oleh sistem.

Akki
sumber
Hai, saya pikir ini bisa menjadi masalah saya. Saya melihat kesalahan ini setiap kali saya menutup pemutar media saya. Saya rasa saya membersihkan semuanya dengan benar, saya menyembunyikan notifikasi, membatalkan pendaftaran penerima, dll. Tetapi saya tetap mendapatkan pesan ini. Perilaku aplikasi tidak terpengaruh olehnya, tetapi saya ingin memperbaikinya. Apa yang harus saya lakukan untuk menghindarinya?
JeCh
0

Dalam kasus saya, saya menggunakan perpustakaan Glide dan gambar yang diteruskan ke sana adalah null. Jadi itu membuang kesalahan ini. Saya memberi tanda cek seperti ini:

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

Dan itu bekerja dengan baik. Semoga ini bisa membantu seseorang.

Adnan Afzal
sumber
0

Saya mendapat pesan logcat yang sama, baru menyadari bahwa nilai string.xml dari array tidak bisa berupa angka / digit, tetapi hanya teks / alfabet yang diperbolehkan.

ALBERT ABAS
sumber
0

Dalam kasus saya, kesalahan ini terjadi karena tidak terhubung ke firebase firestore tetapi menggunakan yang sama.

Untuk memperbaiki masalah ini, buka Tools-> Firebase

ketika jendela akan terbuka di RHS pilih opsi untuk -> Hubungkan aplikasi Anda ke Firebase -> Tambahkan Cloud Firestore ke aplikasi Anda

Keshav Kumar
sumber