关于android:为什么我会收到错误消息“频道已无法恢复,将被丢弃!”

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

当我尝试启动我的AndEngine活动时,出现以下错误:

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

该应用程序不会崩溃,但是会出现黑屏,并且设备对按"后退"或"主页"按钮没有反应。

有人知道问题出在哪里吗?


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


我认为您的某处内存泄漏。您可以在此处找到避免内存泄漏的提示。您也可以在此处了解有关跟踪它的工具。


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

我在2天前解决了类似的问题...

为了简短起见:主线程可以有许多UI线程来执行多项工作,但是如果其中包含一个包含UI线程的子线程,则UI线程可能尚未完成其工作,而其父线程已经完成了它的工作。工作,这会导致内存泄漏。

例如...对于Fragment&UI应用程序...这将导致内存泄漏。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

我的解决方案如下重新排列:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

供您参考。

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


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

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


您可以在此处查看有关此输出的源代码:

1
2
3
4
5
6
7
8
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;
}

这是由于循环中断锁定造成的...


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

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

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


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


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


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

If you call methods on WebView from any thread other than your app's UI thread, it can cause unexpected results. For example, if your app uses multiple threads, you can use the runOnUiThread() method to ensure your code executes on the UI thread:

Google参考连结


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

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

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

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

解答:为什么我遇到错误通道无法恢复,将被破坏!

1
2
3
4
5
6
7
8
9
10
11
@Override
protected void onPause() {
    super.onPause();
    dismissProgressDialog();

}

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

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

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

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

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

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


如果发生内存泄漏,则会发生此错误。例如,如果您具有Android组件的任何静态上下文(活动/服务/等),并且系统将其杀死。

示例:通知区域中的音乐播放器控件。使用前台服务,并通过PendingIntent在通知渠道中设置操作,如下所示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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设备中),则由于内存泄漏,系统会抛出此错误。


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


在使用and-engine进行游戏时,对我来说也是如此。
我将以下代码添加到manifest.xml后,此问题已修复。该代码应添加到您的mainactivity中。

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

我也有同样的问题。就我而言,是由于尝试复制编解码效果差(需要过多内存)的视频而引起的。
这有助于我发现错误并请求使用同一视频的其他版本。
https://stackoverflow.com/a/11986400/2508527


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

使DAO函数挂起,并在工作程序的协程范围内调用它们,这对我来说就是固定的。


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

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

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


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


就我而言
发生此错误是因为未连接到Firebase Firestore,而是使用Firestore。

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

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


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

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

1
android:progressBackgroundTintMode="src_over"

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

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

要么:

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

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

祝好运 :)