Tại sao tôi gặp lỗi 'Kênh bị hỏng không thể phục hồi và sẽ bị xử lý!'


104

Khi tôi cố gắng khởi chạy Hoạt động AndEngine của mình , tôi gặp lỗi này:

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

Ứng dụng không bị lỗi, nhưng có màn hình đen và thiết bị không phản ứng khi nhấn các nút 'quay lại' hoặc 'màn hình chính'.

Có ai biết vấn đề là gì không?


Không thể đoán được nhiều điều từ thông tin bạn đưa ra (Vui lòng bổ sung thêm). Nhưng điều này có thể hữu ích: stackoverflow.com/questions/5551929/inputdispatcher-error Kiểm tra rò rỉ bộ nhớ.
Jong

10
Lỗi đó xuất hiện sau khi ứng dụng gặp sự cố (hoặc bị dừng bắt buộc). Phần trong Android chuyển tiếp các sự kiện đầu vào (lần nhấn trên màn hình cảm ứng, v.v.) tới ứng dụng của bạn đã nhận thấy rằng mục tiêu của nó không còn ở đó nữa. Tìm lỗi xảy ra trước lỗi đó.
zapl

1
@uncle Lem, anh bạn thậm chí tôi đang mắc kẹt trong cùng một vấn đề. Tôi không thể thực hiện bất kỳ thao tác nào cho đến khi khởi động lại điện thoại. bạn đã nhận được bất kỳ giải pháp? Tôi chán ngấy với vấn đề này ..
Krishnamurthy

Câu trả lời:


39

Một trong những lý do phổ biến nhất mà tôi gặp lỗi đó là khi tôi đang cố hiển thị hộp thoại cảnh báo hoặc hộp thoại tiến trình trong một hoạt động không có ở nền trước. Giống như khi một chuỗi nền hiển thị hộp thoại đang chạy trong một hoạt động bị tạm dừng.


2
Đặt hộp thoại thành null trong onPause và kiểm tra null trước khi bạn hiển thị hộp thoại trong chuỗi nền.
Lou Morda

Trong trường hợp của tôi, tôi gặp lỗi vì tôi đã nhận xét các phương thức onResume (), onStart, onStop, onPause, onDestroy và onLowMemory. Cảm ơn @LouMorda về gợi ý!
Maryoomi1

13

Tôi nghĩ rằng Bạn có bộ nhớ bị rò rỉ ở đâu đó. Bạn có thể tìm các mẹo để tránh rò rỉ bộ nhớ tại đây . Ngoài ra bạn có thể tìm hiểu về các công cụ để theo dõi nó tại đây .


9

Bạn đã sử dụng chuỗi giao diện người dùng khác chưa? Bạn không nên sử dụng nhiều hơn 1 chuỗi giao diện người dùng và làm cho nó giống như một chiếc bánh sandwich. Làm điều này sẽ gây ra rò rỉ bộ nhớ.

Tôi đã giải quyết một vấn đề tương tự cách đây 2 ngày ...

Để giữ mọi thứ ngắn gọn: Chuỗi chính có thể có nhiều chuỗi giao diện người dùng để thực hiện nhiều công việc, nhưng nếu một chuỗi phụ có chứa một chuỗi giao diện người dùng nằm bên trong nó, thì chuỗi giao diện người dùng có thể chưa hoàn thành công việc của nó trong khi chuỗi mẹ của nó đã hoàn thành hoạt động, điều này gây ra rò rỉ bộ nhớ.

Ví dụ ... đối với ứng dụng Fragment & UI ... điều này sẽ gây rò rỉ bộ nhớ.

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

Giải pháp của tôi là sắp xếp lại như sau:

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

cho bạn tham khảo.

Tôi là người Đài Loan, tôi rất vui được trả lời ở đây một lần nữa.


6

Bạn có thể xem mã nguồn về đầu ra này tại đây :

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

Đó là do chu kỳ bị hỏng bị khóa ...


13
Bạn có thể nói rõ hơn, chu kỳ bị khóa bị phá vỡ nghĩa là gì?
Jaydev

4

Tôi đã gặp lỗi tương tự (ứng dụng của tôi bị lỗi) sau khi tôi đổi tên một cái gì đó strings.xmlvà quên sửa đổi các tệp khác (tệp tài nguyên xml tùy chọn và mã java).

IDE (android studio) không có bất kỳ lỗi nào. Tuy nhiên, sau khi tôi sửa chữa các tệp xml và mã java của mình, ứng dụng chạy ổn. Vì vậy, có thể có một số lỗi nhỏ trong tệp xml hoặc hằng số của bạn.


Quá khái quát để có thể hiểu được :)
Naga

2

Tôi đã từng gặp vấn đề tương tự. Của tôi là do một jar thứ ba, nhưng logcat không bắt được ngoại lệ, tôi đã giải quyết bằng cách cập nhật jar thứ ba, hy vọng những điều này sẽ giúp ích.


2

Khi tôi gặp phải lỗi này, ở đâu đó trong mã của bạn, các funcs hoặc thư viện của bạn đã sử dụng chạy trên các chuỗi khác nhau, vì vậy hãy thử gọi tất cả mã trên cùng một chuỗi, nó đã khắc phục được sự cố của tôi.

Nếu bạn gọi các phương thức trên WebView từ bất kỳ chuỗi nào khác với chuỗi giao diện người dùng của ứng dụng, nó có thể gây ra kết quả không mong muốn. Ví dụ: nếu ứng dụng của bạn sử dụng nhiều chuỗi, bạn có thể sử dụng phương thức runOnUiThread () để đảm bảo mã của bạn thực thi trên chuỗi giao diện người dùng:

Liên kết tham khảo Google


1

Tôi đã gặp vấn đề tương tự nhưng của tôi là Do rò rỉ bộ nhớ cơ sở dữ liệu Android. Tôi đã bỏ qua một con trỏ. Vậy thiết bị bị treo để khắc phục lỗi rò rỉ bộ nhớ đó. Nếu bạn đang làm việc với cơ sở dữ liệu Android, hãy kiểm tra xem bạn có bỏ qua con trỏ trong khi truy xuất từ ​​cơ sở dữ liệu không


Tôi không sử dụng cơ sở dữ liệu nào trong ứng dụng đó. Có vẻ với tôi rằng có rất nhiều tùy chọn có thể gây ra lỗi đó.
chú Lem

1

Điều đó cũng xảy ra với tôi khi chạy một trò chơi sử dụng và-engine. Nó đã được sửa sau khi tôi thêm mã bên dưới vào tệp kê khai.xml của mình. Mã này nên được thêm vào hoạt động của bạn.

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

1

Tôi đã từng gặp vấn đề tương tự. Để giải quyết lỗi: Đóng nó trên trình giả lập và sau đó chạy nó bằng Android Studio.

Lỗi xảy ra khi bạn cố gắng chạy lại ứng dụng khi ứng dụng đã chạy trên trình giả lập.

Về cơ bản, lỗi cho biết - "Tôi không có kênh hiện có nữa và hủy kết nối đã được thiết lập" khi bạn chạy lại ứng dụng từ Android Studio.


Đã đóng trình giả lập Genymotion. Mở lại trình giả lập. Không có ứng dụng đâm thời gian này :)
Emily Alexandra Conroyd


1

Trong trường hợp của tôi, hai sự cố này xảy ra trong một số trường hợp như khi tôi đang cố gắng hiển thị hộp thoại tiến trình trong một hoạt động không ở phía trước. Vì vậy, tôi loại bỏ hộp thoại tiến trình trong onPause của vòng đời hoạt động. Và vấn đề đã được giải quyết.

Không thể khởi động trình tạo hoạt ảnh này ở chế độ xem tách rời! tiết lộ hiệu ứng BUG

TRẢ LỜI: Không thể khởi động trình tạo hoạt ảnh này trên chế độ xem tách rời! tiết lộ hiệu ứng

Tại sao tôi gặp lỗi 'Kênh bị hỏng không thể phục hồi và sẽ bị xử lý!

TRẢ LỜI: Tại sao tôi gặp lỗi 'Kênh bị hỏng không thể phục hồi được và sẽ bị xử lý!'

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

}

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

1

Tôi đã gặp sự cố này và nguyên nhân thực sự là do NullPointerException. Nhưng nó không được trình bày với tôi như một!

Đầu ra của tôi: màn hình bị kẹt trong một thời gian rất dài và ANR

Trạng thái của tôi: tệp xml bố cục đã được bao gồm một bố cục khác, nhưng đã tham chiếu chế độ xem được bao gồm mà không cung cấp id trong bố cục đính kèm. (tôi có thêm hai cách triển khai tương tự của cùng một chế độ xem con, vì vậy id tài nguyên đã được tạo với tên đã cho)

Lưu ý: đó là bố cục Hộp thoại tùy chỉnh, vì vậy việc kiểm tra hộp thoại trước có thể hữu ích một chút

Kết luận: Có một số rò rỉ bộ nhớ đã xảy ra khi tìm kiếm id của chế độ xem con.


1

Đối với tôi, đó là do hình ảnh màn hình giật gân quá lớn (trên 4000x2000). Vấn đề đã biến mất sau khi giảm kích thước của nó.


0

Đọc qua tất cả các đóng góp, có vẻ như nhiều cuộc triển lãm có nguồn gốc khác nhau gây ra các triệu chứng vấn đề giống nhau này.

Trong trường hợp của tôi chẳng hạn - tôi gặp sự cố này ngay sau khi tôi thêm

android:progressBackgroundTintMode="src_over"

đến thuộc tính thanh tiến trình của tôi. Tôi nghĩ rằng nhà thiết kế GUI của ADT được biết đến với một số lỗi. Do đó tôi cho rằng đây là một trong số chúng. Vì vậy, nếu bạn gặp phải các triệu chứng sự cố tương tự (điều đó không có ý nghĩa) sau khi chơi với thiết lập GUI, chỉ cần cố gắng quay lại những gì bạn đã làm và hoàn tác các sửa đổi GUI cuối cùng của bạn.

Chỉ cần nhấn Ctrl + z với tệp được sửa đổi gần đây trên màn hình.

Hoặc là:

Công cụ Kiểm soát Phiên bản có thể hữu ích. Mở bảng Điều khiển Phiên bản - chọn tab Thay đổi Cục bộ và xem các tệp (có lẽ là .xml) được sửa đổi gần đây.

Nhấp chuột phải vào một số điểm đáng ngờ nhất và nhấp vào Hiển thị Khác biệt. Sau đó, chỉ cần đoán dòng sửa đổi nào có thể chịu trách nhiệm.

Chúc may mắn :)


0

Lỗi này xảy ra trong trường hợp rò rỉ bộ nhớ. Ví dụ: nếu bạn có bất kỳ ngữ cảnh tĩnh nào của một thành phần Android (Activity / service / etc) và nó bị hệ thống giết chết.

Ví dụ: Điều khiển trình phát nhạc trong khu vực thông báo. Sử dụng dịch vụ nền trước và thiết lập các hành động trong kênh thông báo qua PendingIntent như bên dưới.

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

Và nếu kênh thông báo này bị hỏng đột ngột (có thể do hệ thống, như trong thiết bị Xiomi khi chúng tôi xóa các ứng dụng nền), thì do rò rỉ bộ nhớ, lỗi này do hệ thống gây ra.


Xin chào, tôi nghĩ đây có thể là vấn đề của tôi. Tôi gặp lỗi này mỗi khi đóng trình phát đa phương tiện. Tôi nghĩ rằng tôi làm sạch mọi thứ một cách chính xác, tôi ẩn thông báo, hủy đăng ký người nhận, v.v. Nhưng tôi vẫn nhận được thông báo này. Hành vi của ứng dụng không bị ảnh hưởng bởi nó, nhưng tôi vẫn muốn sửa nó. Tôi nên làm gì để tránh nó?
JeCh

0

Trong trường hợp của tôi, tôi đang sử dụng thư viện Glide và hình ảnh được chuyển đến nó là rỗng. Vì vậy, nó đã được ném lỗi này. Tôi đặt một séc như thế này:

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

Và nó hoạt động tốt. Hy vọng điều này sẽ giúp ai đó.


0

Tôi nhận được cùng một thông báo logcat, chỉ cần nhận ra rằng giá trị string.xml của mảng không thể là số / chữ số, nhưng chỉ cho phép văn bản / bảng chữ cái.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.