오류가 발생하는 이유 '채널이 복구 할 수 없게 손상되어 폐기됩니다!'


104

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 메모리 누수를 확인하십시오.
Jong

10
이 오류는 앱이 충돌하거나 강제 종료 된 후에 표시됩니다. 입력 이벤트 (터치 스크린 누름 등)를 앱에 전달하는 Android의 부분은 해당 대상이 더 이상 존재하지 않음을 확인했습니다. 그 전에 발생하는 오류를 찾으십시오.
zapl

1
@ 삼촌 Lem, Bro조차도 같은 문제에 갇혀 있습니다. 전화기를 재부팅 할 때까지 어떤 작업도 수행 할 수 없습니다. 어떤 해결책을 얻었습니까? 나는 ..이 문제를 함께 공급하고있다
크리슈나 무르

답변:


39

오류가 발생하는 가장 일반적인 이유 중 하나는 포 그라운드에 있지 않은 활동에서 경고 대화 상자 또는 진행 대화 상자를 표시하려고 할 때입니다. 대화 상자를 표시하는 백그라운드 스레드가 일시 중지 된 활동에서 실행 중일 때와 같습니다.


2
onPause에서 대화 상자를 null로 설정하고 백그라운드 스레드에 대화 상자를 표시하기 전에 null을 확인합니다.
Lou Morda

제 경우에는 onResume (), onStart, onStop, onPause, onDestroy 및 onLowMemory 메서드를 주석 처리했기 때문에 오류가 발생했습니다. 힌트에 대해 @LouMorda에게 감사드립니다!
Maryoomi1


9

다른 UI 스레드를 사용 했습니까? 두 개 이상의 UI 스레드를 사용하지 말고 샌드위치처럼 보이게해야합니다. 이렇게하면 메모리 누수가 발생합니다.

2 일 전에 비슷한 문제를 해결했습니다 ...

짧게 유지하기 위해 : 메인 스레드는 여러 작업을 수행하기 위해 많은 UI 스레드를 가질 수 있지만 UI 스레드를 포함하는 하나의 하위 스레드가 내부에있는 경우 UI 스레드는 아직 작업을 완료하지 않은 반면 부모 스레드는 이미 작업을 완료했을 수 있습니다. 작동하면 메모리 누수가 발생합니다.

예를 들어 ... 조각 및 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;
}

그것은 잠긴 사이클로 인한 원인입니다 ...


13
자세히 설명해 주시겠습니까? cycle broken locked은 (는) 무엇을 의미합니까?
Jaydev

4

에서 이름을 바꾸고 strings.xml다른 파일 (기본 설정 xml 리소스 파일 및 Java 코드)을 수정하는 것을 잊은 후 비슷한 오류 (내 앱 충돌)가 발생했습니다 .

IDE (안드로이드 스튜디오)는 오류를 표시하지 않았습니다. 하지만 xml 파일과 자바 코드를 복구 한 후 앱이 정상적으로 실행되었습니다. 따라서 xml 파일이나 상수에 약간의 실수가있을 수 있습니다.


이해하기에는 너무 일반화되어 있습니다. :)
Naga

2

나는 같은 문제가 있었다. 내 것은 세 번째 항아리 때문 이었지만 logcat은 예외를 포착하지 못했고 세 번째 항아리를 업데이트하여 해결했습니다. 이것들이 도움이되기를 바랍니다.


2

이 오류에 직면했을 때 코드의 어딘가에서 사용되는 funcs 또는 라이브러리가 다른 스레드에서 실행되므로 동일한 스레드에서 모든 코드를 호출하려고 시도하면 문제가 해결되었습니다.

앱의 UI 스레드가 아닌 다른 스레드에서 WebView의 메서드를 호출하면 예기치 않은 결과가 발생할 수 있습니다. 예를 들어 앱에서 여러 스레드를 사용하는 경우 runOnUiThread () 메서드를 사용하여 코드가 UI 스레드에서 실행되도록 할 수 있습니다.

Google 참조 링크


1

나는 같은 문제가 있었지만 Android 데이터베이스 메모리 누수로 인해 발생했습니다. 커서를 건너 뛰었습니다. 따라서 메모리 누수를 해결하기 위해 장치가 충돌합니다. Android 데이터베이스로 작업하는 경우 데이터베이스에서 검색하는 동안 커서를 건너 뛰었는지 확인하십시오.


나는 그 앱에서 데이터베이스를 사용하지 않았습니다. 그 오류를 일으킬 수있는 많은 옵션이있는 것 같습니다.
삼촌 Lem

1

and-engine을 사용하여 게임을 실행하는 동안 저에게도 발생했습니다. 아래 코드를 manifest.xml에 추가 한 후 수정되었습니다. 이 코드는 mainactivity에 추가되어야합니다.

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

1

나는 같은 문제가 있었다. 오류를 해결하려면 에뮬레이터에서 닫은 다음 Android Studio를 사용하여 실행합니다.

앱이 이미 에뮬레이터에서 실행 중일 때 앱을 다시 실행하려고하면 오류가 발생합니다.

기본적으로 오류는 Android Studio에서 앱을 다시 실행 했으므로 "더 이상 기존 채널이 없으며 이미 설정된 연결을 폐기합니다."라고 표시 됩니다.


Genymotion 에뮬레이터를 닫았습니다. 에뮬레이터를 다시 열었습니다. :)이 시간을 충돌 어떤 응용 프로그램 없습니다
에밀리 알렉산드라 Conroyd


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가 주어진 이름으로 생성되었습니다)

참고 : 사용자 정의 대화 상자 레이아웃이므로 대화 상자를 먼저 확인하면 도움이 될 수 있습니다.

결론 : 자식 뷰의 ID를 검색 할 때 메모리 누수가 발생했습니다.


1

저에게는 너무 큰 스플래시 화면 이미지 (4000x2000 이상)로 인해 발생했습니다. 크기를 줄인 후 문제가 사라졌습니다.


0

모든 기여를 읽어 보면 여러 기원이 동일한 문제 증상을 일으키는 것으로 보입니다.

예를 들어 제 경우에는-추가 하자마자이 문제가 발생했습니다.

android:progressBackgroundTintMode="src_over"

내 진행률 표시 줄 속성에. ADT의 GUI 디자이너는 몇 가지 버그로 유명하다고 생각합니다. 따라서 나는 이것이 그들 중 하나라고 가정합니다. 따라서 GUI 설정을 사용한 후 유사한 문제 증상 (이치에 맞지 않음)이 발생하면 수행 한 작업을 롤백하고 마지막 GUI 수정을 실행 취소하십시오.

최근에 수정 된 파일이 화면에 표시된 상태에서 Ctrl + z를 누르기 만하면됩니다.

또는:

버전 관리 도구가 도움이 될 수 있습니다. 버전 제어 패널을 열고 로컬 변경 사항 탭을 선택하고 최근에 수정 된 파일 (예 : .xml)을 확인합니다.

가장 의심스러운 것을 마우스 오른쪽 버튼으로 클릭하고 차이 표시를 클릭합니다. 그런 다음 어떤 수정 된 라인이 원인 일 수 있는지 추측하십시오.

행운을 빕니다 :)


0

이 오류는 메모리 누수시 발생했습니다. 예를 들어 Android 구성 요소 (Activity / service / etc)의 정적 컨텍스트가 있고 시스템에 의해 종료되는 경우입니다.

예 : 알림 영역의 음악 플레이어 컨트롤. 포 그라운드 서비스를 사용하고 아래와 같이 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 장치 에서처럼 시스템에 의해 발생할 수 있음) 메모리 누수로 인해 시스템에서이 오류가 발생합니다.


안녕하세요, 이것이 제 문제라고 생각합니다. 미디어 플레이어를 닫을 때마다이 오류가 표시됩니다. 나는 모든 것을 올바르게 정리하고, 알림을 숨기고, 수신자 등록을 취소하는 등의 작업을한다고 생각합니다. 그러나 어쨌든이 메시지가 나타납니다. 응용 프로그램 동작은 영향을받지 않지만 어쨌든 수정하고 싶습니다. 그것을 피하려면 어떻게해야합니까?
JeCh

0

제 경우에는 Glide 라이브러리를 사용하고 있었고 전달 된 이미지는 null이었습니다. 그래서이 오류가 발생했습니다. 다음과 같은 수표를 넣습니다.

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

그리고 그것은 잘 작동했습니다. 이것이 누군가를 돕기를 바랍니다.


0

동일한 logcat 메시지를 받았는데 배열의 string.xml 값이 숫자 / 숫자 일 수 없지만 텍스트 / 알파벳 만 허용된다는 것을 깨달았습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.