เหตุใดฉันจึงได้รับข้อผิดพลาด 'ช่องไม่สามารถกู้คืนได้และจะถูกกำจัด!'


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ตรวจสอบหน่วยความจำรั่ว
จง

10
ข้อผิดพลาดนั้นจะปรากฏขึ้นหลังจากแอพขัดข้อง (หรือถูกบังคับให้หยุด) ส่วนใน Android ที่ส่งต่อเหตุการณ์การป้อนข้อมูล (การกดหน้าจอสัมผัส ฯลฯ ) ไปยังแอปของคุณสังเกตเห็นว่าไม่มีเป้าหมายแล้ว มองหาข้อผิดพลาดที่เกิดขึ้นก่อนหน้านั้น
zapl

1
@uncle Lem, Bro แม้ฉันจะติดอยู่ในปัญหาเดียวกัน ฉันไม่สามารถดำเนินการใด ๆ ได้จนกว่าฉันจะรีบูตโทรศัพท์ คุณได้รับวิธีแก้ปัญหาหรือไม่? ฉันเบื่อหน่ายกับปัญหานี้ ..
krishnamurthy

คำตอบ:


41

สาเหตุทั่วไปประการหนึ่งที่ฉันเห็นข้อผิดพลาดนั้นคือเมื่อฉันพยายามแสดงกล่องโต้ตอบการแจ้งเตือนหรือกล่องโต้ตอบความคืบหน้าในกิจกรรมที่ไม่ได้อยู่เบื้องหน้า เช่นเดียวกับเมื่อเธรดพื้นหลังที่แสดงกล่องโต้ตอบกำลังทำงานในกิจกรรมที่หยุดชั่วคราว


2
ตั้งค่ากล่องโต้ตอบเป็น null ใน onPause และตรวจสอบค่าว่างก่อนที่คุณจะแสดงกล่องโต้ตอบในเธรดพื้นหลัง
Lou Morda

ในกรณีของฉันฉันได้รับข้อผิดพลาดเนื่องจากฉันแสดงความคิดเห็นเกี่ยวกับวิธีการResume (), onStart, onStop, onPause, onDestroy และ onLowMemory ขอบคุณ @LouMorda สำหรับคำใบ้!
Maryoomi1

13

ฉันคิดว่าคุณมีความจำรั่วที่ไหนสักแห่ง คุณสามารถค้นหาเคล็ดลับเพื่อหลีกเลี่ยงการรั่วไหลของหน่วยความจำที่นี่ นอกจากนี้คุณสามารถเรียนรู้เกี่ยวกับเครื่องมือในการติดตามลงที่นี่


7

คุณเคยใช้เธรด UI อื่นหรือไม่? คุณไม่ควรใช้เธรด UI มากกว่า 1 เธรดและทำให้ดูเหมือนแซนวิช การทำเช่นนี้จะทำให้หน่วยความจำรั่วไหล

ฉันได้แก้ไขปัญหาที่คล้ายกันเมื่อ 2 วันก่อน ...

เพื่อให้สิ่งต่าง ๆ สั้น: เธรดหลักสามารถมีเธรด UI หลายเธรดเพื่อทำงานได้หลายอย่าง แต่ถ้าเธรดย่อยหนึ่งเธรดที่มีเธรด UI อยู่ภายในเธรด UI อาจยังทำงานไม่เสร็จในขณะที่เธรดหลักเสร็จสิ้นแล้ว ซึ่งทำให้หน่วยความจำรั่วไหล

ตัวอย่างเช่น ... สำหรับแอปพลิเคชัน 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;
}

มันเกิดจากวงจรเสียล็อค ...


14
คุณช่วยอธิบายได้ไหมว่า Cycle Broken Lock หมายถึงอะไร?
Jaydev

4

ฉันได้รับข้อผิดพลาดที่คล้ายกัน (แอปของฉันขัดข้อง) หลังจากที่ฉันเปลี่ยนชื่อบางสิ่งในstrings.xmlและลืมแก้ไขไฟล์อื่น ๆ (ไฟล์ทรัพยากร xml ค่ากำหนดและรหัส java)

IDE (android studio) ไม่พบข้อผิดพลาดใด ๆ แต่หลังจากฉันซ่อมแซมไฟล์ xml และรหัส java แล้วแอปก็ทำงานได้ดี ดังนั้นอาจมีข้อผิดพลาดเล็กน้อยในไฟล์ xml หรือค่าคงที่


กว้างเกินไปที่จะเข้าใจ :)
นากา

2

ผมมีปัญหาเหมือนกัน. ของฉันเกิดจากโถที่สาม แต่ Logcat ไม่พบข้อยกเว้นฉันแก้ไขโดยการอัปเดตโถที่สามหวังว่าสิ่งเหล่านี้จะช่วยได้


2

ขณะที่ฉันพบข้อผิดพลาดนี้บางแห่งในโค้ดของคุณ funcs หรือไลบรารีของคุณที่ใช้รันบนเธรดที่แตกต่างกันดังนั้นลองเรียกรหัสทั้งหมดในเธรดเดียวกันมันช่วยแก้ปัญหาของฉันได้

หากคุณเรียกใช้เมธอดบน WebView จากเธรดอื่นที่ไม่ใช่เธรด UI ของแอปอาจทำให้เกิดผลลัพธ์ที่ไม่คาดคิด ตัวอย่างเช่นหากแอปของคุณใช้หลายเธรดคุณสามารถใช้เมธอด runOnUiThread () เพื่อให้แน่ใจว่าโค้ดของคุณรันบนเธรด UI:

ลิงก์อ้างอิงของ Google


1

ฉันมีปัญหาเดียวกัน แต่ของฉันเกิดจากการรั่วไหลของหน่วยความจำฐานข้อมูล Android ฉันข้ามเคอร์เซอร์ ดังนั้นอุปกรณ์จึงขัดข้องเพื่อแก้ไขการรั่วไหลของหน่วยความจำ หากคุณกำลังทำงานกับฐานข้อมูล Android ให้ตรวจสอบว่าคุณข้ามเคอร์เซอร์ขณะดึงข้อมูลจากฐานข้อมูลหรือไม่


ฉันไม่ได้ใช้ไม่มีฐานข้อมูลในแอปนั้น สำหรับฉันแล้วดูเหมือนว่ามีตัวเลือกมากมายที่อาจทำให้เกิดข้อผิดพลาดนั้น
ลุงเลม

1

มันเกิดขึ้นสำหรับฉันเช่นกันในขณะที่เล่นเกมโดยใช้ and-engine ได้รับการแก้ไขหลังจากที่ฉันเพิ่มโค้ดด้านล่างใน manifest.xml ของฉัน ควรเพิ่มรหัสนี้ในการทำงานหลักของคุณ

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

1

ผมมีปัญหาเหมือนกัน. ในการแก้ไขข้อผิดพลาด: ปิดบนโปรแกรมจำลองจากนั้นเรียกใช้โดยใช้ Android Studio

ข้อผิดพลาดเกิดขึ้นเมื่อคุณพยายามเรียกใช้แอปอีกครั้งเมื่อแอปทำงานบนโปรแกรมจำลองอยู่แล้ว

โดยทั่วไปข้อผิดพลาดระบุว่า - "ฉันไม่มีช่องที่มีอยู่แล้วและกำลังยกเลิกการเชื่อมต่อที่สร้างไว้แล้ว"ขณะที่คุณเรียกใช้แอปจาก Android Studio อีกครั้ง


ปิดโปรแกรมจำลอง Genymotion เปิดโปรแกรมจำลองอีกครั้งเรียกดู ไม่มีแอปใดหยุดทำงานในครั้งนี้ :)
Emily Alexandra Conroyd

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

1

ฉันมีปัญหานี้และสาเหตุคือ NullPointerException แต่ไม่ได้นำเสนอให้ฉันเป็นหนึ่งเดียว!

ผลลัพธ์ของฉัน: หน้าจอค้างเป็นเวลานานมากและ ANR

สถานะของฉัน: ไฟล์ xml เลย์เอาต์ถูกรวมเลย์เอาต์อื่น แต่อ้างอิงมุมมองที่รวมโดยไม่ให้ id ในเลย์เอาต์ที่แนบมา (ฉันมีการใช้งานที่คล้ายกันอีกสองรายการในมุมมองลูกเดียวกันดังนั้นรหัสทรัพยากรจึงถูกสร้างขึ้นด้วยชื่อที่กำหนด)

หมายเหตุ: เป็นรูปแบบกล่องโต้ตอบที่กำหนดเองดังนั้นการตรวจสอบกล่องโต้ตอบก่อนอาจช่วยได้เล็กน้อย

สรุป: มีหน่วยความจำรั่วเกิดขึ้นในการค้นหา id ของมุมมองเด็ก


1

ข้อผิดพลาดนี้เกิดขึ้นในกรณีหน่วยความจำรั่ว ตัวอย่างเช่นหากคุณมีบริบทคงที่ของส่วนประกอบ 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 เมื่อเราล้างแอปพื้นหลัง) ระบบจะส่งข้อผิดพลาดนี้เนื่องจากหน่วยความจำรั่ว


1
สวัสดีฉันคิดว่านี่อาจเป็นปัญหาของฉัน ฉันเห็นข้อผิดพลาดนี้ทุกครั้งที่ปิดเครื่องเล่นสื่อ ฉันคิดว่าฉันทำความสะอาดทุกอย่างถูกต้องฉันซ่อนการแจ้งเตือนยกเลิกการลงทะเบียนเครื่องรับ ฯลฯ แต่ฉันก็ได้รับข้อความนี้อยู่ดี ลักษณะการทำงานของแอปพลิเคชันไม่ได้รับผลกระทบ แต่ฉันต้องการแก้ไขต่อไป ฉันควรทำอย่างไรเพื่อหลีกเลี่ยง?
JeCh

@JeCh เจออะไรมั้ย?
vaibhavS

1

สำหรับฉันมันเกิดจากภาพหน้าจอเริ่มต้นที่ใหญ่เกินไป (มากกว่า 4000x2000) ปัญหาหายไปหลังจากลดขนาด


0

เมื่ออ่านการมีส่วนร่วมทั้งหมดดูเหมือนว่าการจัดแสดงต้นกำเนิดที่แตกต่างกันจำนวนมากทำให้เกิดอาการปัญหาเดียวกันนี้

ในกรณีของฉันเช่น - ฉันพบปัญหานี้ทันทีที่เพิ่ม

android:progressBackgroundTintMode="src_over"

ไปยังคุณสมบัติแถบความคืบหน้าของฉัน ฉันคิดว่าผู้ออกแบบ GUI ของ ADT เป็นที่รู้จักสำหรับข้อบกพร่องหลายประการ ดังนั้นฉันถือว่านี่เป็นหนึ่งในนั้น ดังนั้นหากคุณพบอาการของปัญหาที่คล้ายกัน (ซึ่งไม่สมเหตุสมผล) หลังจากเล่นกับการตั้งค่า GUI ของคุณให้ลองย้อนกลับสิ่งที่คุณทำและเลิกทำการแก้ไข GUI ล่าสุดของคุณ

เพียงกด Ctrl + z ด้วยไฟล์ที่แก้ไขล่าสุดบนหน้าจอ

หรือ:

เครื่องมือควบคุมเวอร์ชันอาจเป็นประโยชน์ เปิดแผงควบคุมเวอร์ชัน - เลือกแท็บ Local Changes และดูไฟล์ที่แก้ไขล่าสุด (อาจเป็น. xml)

คลิกขวาที่รายการที่น่าสงสัยที่สุดแล้วคลิกแสดงความแตกต่าง จากนั้นเพียงแค่เดาว่าบรรทัดที่แก้ไขใดที่สามารถรับผิดชอบได้

โชคดี :)


0

ในกรณีของฉันฉันใช้ไลบรารี Glide และรูปภาพที่ส่งผ่านไปเป็นโมฆะ ดังนั้นจึงทำให้เกิดข้อผิดพลาดนี้ ฉันตรวจสอบดังนี้:

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

และมันก็ใช้ได้ดี หวังว่านี่จะช่วยใครบางคนได้


0

ฉันได้รับข้อความ logcat เหมือนกันเพิ่งทราบว่าค่า string.xml ของอาร์เรย์ไม่สามารถเป็นตัวเลข / หลักได้ แต่อนุญาตให้ใช้เฉพาะข้อความ / ตัวอักษรเท่านั้น


0

ในกรณีของฉันข้อผิดพลาดนี้เกิดขึ้นเนื่องจากไม่ได้เชื่อมต่อกับ firebase firestore แต่ใช้สิ่งเดียวกัน

หากต้องการแก้ไขปัญหาโปรดไปที่Tools-> Firebase

เมื่อหน้าต่างจะเปิดขึ้นใน RHS ให้เลือกตัวเลือกเพื่อ -> เชื่อมต่อแอปของคุณกับ Firebase -> เพิ่ม Cloud Firestore ให้กับแอปของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.