android - 安卓:为什么我得到错误'Channel is unrecoverably broken and will be disposed'!

尝试启动AndEngine Activity时,出现这个错误:


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



应用程序没有崩溃,但出现黑屏。

谁知道这个问题是什么?

时间:

我看到的最常见的原因之一是当我在不在前台的Activity 中显示警报对话框或者进度对话框时。 显示对话框的后台线程在暂停的Activity 中运行时一样。

我想你有内存泄漏。 你可以在这里找到一些提示来避免泄漏内存( ) 。 你还可以了解到在这里跟踪它的工具( ) 。

这里可以看到有关此输出的源代码:


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;


}



你用过UI新线程?不要重复使用UI新线程,那样会导致内存泄漏。

我两天前遇到了同样的麻烦,现在解决了。

简而言之,一个主线程可以有许多UI线程来完成许多工作,但是如果一个子线程(不是主线程)在内部拥有一个UI线程,则也许子线程已完成工作,但是它子 UI线程尚未完成工作,这将防止内存泄漏。

例如,对于fragment & UI application,这将导致内存泄漏。


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



供你参考。

我也有同样的问题,但原因是Android数据库内存泄漏,我跳过了光标,所以设备崩溃,需要修复内存泄漏。如果正在使用Android数据库,请检查你是否在从数据库检索时跳过了游标,

在运行游戏和引擎时,也发生这种情况,在将下面的代码添加到manifest.xml之后,它被修复,此代码应添加到mainactivity。


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




@Override


protected void onPause() {


 super.onPause();


 dismissProgressDialog();



}



private void dismissProgressDialog() {


 if(progressDialog != null && progressDialog.isShowing())


 progressDialog.dismiss();


}



...