エラーが発生する理由「チャネルが回復不能に破壊され、破棄されます!」


104

AndEngineアクティビティを起動しようとすると、次のエラーが発生します。

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

回答:


39

エラーが表示される最も一般的な理由の1つは、フォアグラウンドではないアクティビティでアラートダイアログまたは進行状況ダイアログを表示しようとしたときです。ダイアログボックスを表示するバックグラウンドスレッドが一時停止されたアクティビティで実行されているときのように。


2
onPauseでダイアログをnullに設定し、ダイアログをバックグラウンドスレッドで表示する前にnullを確認します。
Lou Morda、2014

私の場合、onResume()、onStart、onStop、onPause、onDestroy、およびonLowMemoryメソッドをコメントアウトしたため、エラーが発生しました。ヒントをありがとう@LouMorda!
Maryoomi1


9

別のUIスレッドを使用しましたか?複数のUIスレッドを使用して、サンドイッチのように見せないでください。これを行うと、メモリリークが発生します。

2日前に同様の問題を解決しました...

短くするために:メインスレッドは複数の作業を実行するために多くのUIスレッドを持つことができますが、UIスレッドを含む1つのサブスレッドがその中にある場合、親スレッドがすでに完了している間、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
詳しく説明してください、サイクルが壊れてロックされているとはどういう意味ですか?
Jaydev 2018

4

何かの名前を変更した後、同様のエラーが発生しました(アプリがクラッシュします) strings.xmlを変更して他のファイル(設定XMLリソースファイルとJavaコード)を変更するのを忘れたます)が発生しました。

IDE(android studio)はエラーを表示しませんでした。しかし、xmlファイルとJavaコードを修復した後、アプリは正常に実行されました。したがって、XMLファイルまたは定数にいくつかの小さな間違いがあるかもしれません。


しかし、理解するには一般化されすぎています:)
Naga

2

私も同じ問題を抱えていました。鉱山は3番目のjarが原因でしたが、logcatは例外をキャッチしませんでした。3番目のjarを更新することで解決しました。


2

私がこのエラーに直面したので、コードのどこかで使用していた関数またはライブラリが異なるスレッドで実行されたため、同じスレッドですべてのコードを呼び出そうとすると、問題が解決しました。

アプリのUIスレッド以外のスレッドからWebViewのメソッドを呼び出すと、予期しない結果が生じる可能性があります。たとえば、アプリが複数のスレッドを使用する場合、runOnUiThread()メソッドを使用して、コードがUIスレッドで実行されるようにすることができます。

Google参照リンク


1

同じ問題がありましたが、Androidデータベースのメモリリークが原因でした。カーソルをスキップしました。そのため、メモリリークを修正するためにデバイスがクラッシュします。Androidデータベースを使用している場合は、データベースからの取得中にカーソルをスキップしたかどうかを確認します


そのアプリではデータベースを使用していません。そのエラーを引き起こす可能性のあるオプションがたくさんあるように私には思えます。
叔父のレム2013

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 2017年


1

私の場合、これら2つの問題は、フォアグラウンドにないアクティビティで進行状況ダイアログを表示しようとしている場合などに発生します。そこで、アクティビティのライフサイクルのonPauseで進行状況ダイアログを閉じます。そして問題は解決されました。

デタッチされたビューではこのアニメーターを開始できません!効果バグを明らかにする

回答: このアニメータを分離ビューで起動することはできません!効果を明らかにする

エラーが発生するのはなぜですか 'チャネルは回復不能に壊れており、破棄されます!

回答: なぜエラーが発生するのですか「チャネルが回復不能に壊れて破棄されます!」

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

}

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

1

私にはこの問題があり、原因は実際にはNullPointerExceptionでした。しかし、それは一つとして私に提示されませんでした!

私の出力:画面が非常に長い時間スタックし、ANR

私の状態:レイアウトxmlファイルは別のレイアウトに含まれていましたが、添付されたレイアウトでIDを指定せずに含まれているビューを参照しました。(私は同じ子ビューの2つの同様の実装を持っていたので、リソースIDは指定された名前で作成されました)

注:これはカスタムダイアログレイアウトだったので、最初にダイアログをチェックすると少し役立つ場合があります

結論:子ビューのIDを検索すると、メモリリークが発生します。


1

私にとっては、スプラッシュスクリーンの画像が大きすぎる(4000x2000以上)ことが原因でした。寸法を小さくすると問題は解消しました。


0

すべての寄稿を読んでみると、さまざまな出所が異なるため、同じ問題の症状が発生しているようです。

たとえば私の場合-追加するとすぐにこの問題が発生しました

android:progressBackgroundTintMode="src_over"

プログレスバーのプロパティに。ADTのGUIデザイナーはいくつかのバグで知られていると思います。したがって、これはその1つだと思います。したがって、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.