为什么我会收到错误'频道无法恢复,将被处理!'

时间:2012-09-17 12:59:06

标签: android andengine

当我尝试启动 AndEngine活动时,我收到此错误:

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

该应用程序不会崩溃,但是有一个黑屏,设备对按下“后退”或“主页”按钮没有反应。

有谁知道问题是什么?

24 个答案:

答案 0 :(得分:34)

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

答案 1 :(得分:13)

我认为你在某处有内存泄漏。您可以找到避免泄漏内存的提示here。您还可以了解有关追踪here的工具。

答案 2 :(得分:6)

您是否使用过其他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

供您参考。

我是台湾人,我很高兴再次回答。

答案 3 :(得分:6)

您可以看到有关此输出的源代码here

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

这是因为周期被锁定...

答案 4 :(得分:4)

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

IDE(android studio)没有显示任何错误。但是,在我修复了我的xml文件和java代码后,app运行正常。所以,也许你的xml文件或常量中有一些小错误。

答案 5 :(得分:1)

我有同样的问题,但我的是由于Android数据库内存泄漏。我跳过了一个光标。因此设备崩溃以便修复内存泄漏。如果您正在使用Android数据库,请检查从数据库中检索时是否跳过了光标

答案 6 :(得分:1)

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

  

如果从应用程序的UI线程以外的任何线程调用WebView上的方法,则可能导致意外结果。例如,如果您的应用程序使用多个线程,则可以使用runOnUiThread()方法来确保您的代码在UI线程上执行:

Google reference link

答案 7 :(得分:1)

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

无法在独立视图上启动此动画师!揭示效果BUG

答案: Cannot start this animator on a detached view! reveal effect

为什么我会收到错误'频道被无法恢复并将被处理掉!

答案: Why I am Getting Error 'Channel is unrecoverably broken and will be disposed!'

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

}

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

答案 8 :(得分:1)

尝试使缓存的 IDE 无效并重新启动。这不会解决问题。但在我的情况下,这样做揭示了可能的崩溃

答案 9 :(得分:1)

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

答案 10 :(得分:1)

在使用and-engine运行游戏时,我也遇到过这种情况。 我将以下代码添加到manifest.xml后修复了它。此代码应添加到您的mainactivity中。

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

答案 11 :(得分:1)

我也有同样的问题。在我的情况下,当试图复制编码较差的视频(需要太多的记忆)时引起。 This帮助我捕获错误并请求同一视频的另一个版本。 https://stackoverflow.com/a/11986400/2508527

答案 12 :(得分:0)

检查您的 ViewModel 类并没有发现任何问题,然后尝试在您使用 launch 或 withContext 的地方注释代码。

就我而言,我评论了我使用 launch 或 withContext 的代码,并且我的应用程序运行正常。

答案 13 :(得分:0)

很明显,由于许多问题,这种情况正在蔓延。 对我来说,我发布了几个OneTimeWorkRequest,每个访问一个房间数据库,然后插入一个表。

暂停DAO函数,并在工作程序的协程范围内调用它们,为我解决此问题。

答案 14 :(得分:0)

请检查您的 Realm 实体类。

如果您将变量声明为 lateinit var 并且 您尝试检查未初始化的变量检查 isNullOrEmpty() 返回“通道不可恢复地损坏并将被处理!”

答案 15 :(得分:0)

就我而言 之所以发生此错误,是因为未连接到Firebase Firestore而是使用相同的源。

要解决此问题,请转到 工具-> Firebase

在RHS上打开一个窗口时,请选择以下选项: ->将您的应用程序连接到Firebase ->将Cloud Firestore添加到您的应用

答案 16 :(得分:0)

我得到了同样的logcat消息,只是意识到数组的string.xml值不能为数字/数字,但只能输入文本/字母。

答案 17 :(得分:0)

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

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

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

答案 18 :(得分:0)

对我来说,这是由初始屏幕图像太大(超过4000x2000)引起的。缩小尺寸后问题消失了。

答案 19 :(得分: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设备中),则由于内存泄漏,系统会抛出此错误。

答案 20 :(得分:0)

我看到该错误的原因之一是我的backend(node.js)包太旧了。更新所有软件包后,我的问题解决了。

npm update **or** npm mongoose@latest --save

答案 21 :(得分:0)

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

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

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

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

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

答案 22 :(得分:0)

通过阅读所有贡献,看起来许多不同的起源都会导致同样的问题症状。

就我而言 - 我在添加

时就遇到了这个问题
android:progressBackgroundTintMode="src_over"

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

只需按下Ctrl + z,屏幕上最近修改过的文件即可。

或者:

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

右键单击最可疑的一个,然后单击“显示差异”。 然后猜测哪条修改过的行可以负责。

祝你好运:)

答案 23 :(得分:0)

我遇到了同样的问题。 要解决错误: 在模拟器上关闭它,然后使用Android Studio运行它。

当您尝试在应用程序已在模拟器上运行时重新运行应用程序时,会发生错误。

基本上错误显示 - “我不再拥有现有频道并处理已建立的连接”,因为您再次从Android Studio运行应用程序。