为什么我会收到错误消息“通道无法恢复,将被丢弃!”


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检查内存泄漏。
2012年

10
该错误在应用崩溃(或被强制停止)后显示。Android中将输入事件(触摸屏按键等)转发到您的应用程序的部分已经注意到,它的目标不再存在。寻找在那之前发生的错误。
zapl 2012年

1
@Uncle Lem,兄弟,甚至我也陷入同样的​​困境。在重启手机之前,我无法执行任何操作。你有解决办法吗?我受够了这个问题..
krishnamurthy

Answers:


39

我看到该错误的最常见原因之一是,当我尝试在不在前台的活动中显示警报对话框或进度对话框时。就像在一个暂停的活动中运行一个显示对话框的后台线程时一样。


2
在onPause中将对话框设置为null,然后在后台线程中显示对话框之前检查是否为null。
Lou Morda 2014年

就我而言,出现错误是因为我注释掉了onResume(),onStart,onStop,onPause,onDestroy和onLowMemory方法。谢谢@LouMorda的提示!
Maryoomi1


9

您是否使用过另一个UI线程?您不应使用超过1个UI线程并使它看起来像一个三明治。这样做会导致内存泄漏。

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

这是由于循环中断锁定...


13
您能详细说明一下,循环断开锁定是什么意思?
Jaydev

4

在重命名某些内容strings.xml并忘记修改其他文件(首选项xml资源文件和Java代码)后,出现类似的错误(我的应用程序崩溃)。

IDE(android studio)没有显示任何错误。但是,在我修复了xml文件和Java代码之后,应用程序运行正常。因此,您的xml文件或常量中可能存在一些小错误。


太笼统而无法理解:)
Naga

2

我有同样的问题。我的是由于第三个jar,但是logcat没有捕获到异常,我通过更新第三个jar解决了,希望这些对您有所帮助。


2

当我遇到此错误时,在您代码的某个位置,您使用过的函子或库在不同线程上运行,因此尝试在同一线程上调用所有代码,这解决了我的问题。

如果从应用程序的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模拟器。再次打开模拟器。这次没有应用崩溃:)
Emily Alexandra Conroyd


1

就我而言,这两个问题在某些情况下会发生,例如,当我尝试在不在前台的活动中显示进度对话框时。因此,我关闭了活动生命周期的onPause中的进度对话框。问题已解决。

无法在独立视图上启动此动画制作器!显示效果错误

解答: 无法在独立视图上启动此动画制作器!揭示效果

为什么我会出错?频道无法恢复,将被丢弃!

解答: 为什么我会收到错误消息“通道无法恢复,将被丢弃!”

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

}

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

1

我遇到了这个问题,原因实际上是NullPointerException。但是它并没有作为一个整体呈现给我!

我的输出:屏幕卡住了很长时间,并且ANR

我的状态:布局xml文件包含另一个布局,但引用了包含的视图,但未在附加的布局中提供ID。(我在同一子视图中还有两个类似的实现,因此资源ID是使用给定名称创建的)

注意:这是“自定义对话框”布局,因此先检查对话框可能会有所帮助

结论:搜索子视图的ID时发生了一些内存泄漏。



0

通读所有的文章,看起来许多不同的出处都表现出引起同样问题的症状。

以我为例-添加后,我就遇到了这个问题

android:progressBackgroundTintMode="src_over"

我的进度栏属性。我认为ADT的GUI设计器因存在多个错误而闻名。因此,我认为这是其中之一。因此,如果在使用GUI设置后遇到类似的问题症状(没有意义),请尝试回滚所做的操作并撤消上一次的GUI修改。

只需按Ctrl + z,屏幕上就会显示最近修改的文件。

要么:

版本控制工具可能会有所帮助。打开“版本控制”面板-选择“本地更改”选项卡,查看最近修改的(也许是.xml)文件。

右键单击一些最可疑的文件,然后单击“显示差异”。然后,只需猜测可能由哪个修改的行负责。

祝好运 :)


0

如果发生内存泄漏,则会发生此错误。例如,如果您具有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设备中),则由于内存泄漏,系统会抛出此错误。


嗨,我认为这可能是我的问题。每次关闭媒体播放器时,都会看到此错误。我想我可以正确地清理所有内容,隐藏通知,取消注册接收者等。但是无论如何我都会收到此消息。应用程序的行为不受它的影响,但是我还是想修复它。我应该怎么做才能避免这种情况?
JeCh

0

就我而言,我正在使用Glide库,传递给它的图像为空。因此它引发了此错误。我把这样的支票:

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

而且效果很好。希望这对某人有帮助。


0

我得到了相同的logcat消息,只是意识到array的string.xml值不能为数字/数字,但仅允许文本/字母。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.