栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

java.lang.RuntimeException:无法从宗地读取输入通道文件描述符

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java.lang.RuntimeException:无法从宗地读取输入通道文件描述符

认为这是一个非常广阔的领域,可能有很多情况会触发此系统级异常。但是也许这个如何将其固定在特定项目中的示例可以对某人有所帮助。

我遇到了类似的例外:

"Could not read input channel file descriptors from parcel"
在三星手机上:

java.lang.RuntimeException: Could not read input channel file descriptors from parcel.        at android.view.InputChannel.nativeReadFromParcel(Native Method)        at android.view.InputChannel.readFromParcel(InputChannel.java:148)        at android.view.IWindowSession$Stub$Proxy.addToDisplay(IWindowSession.java:690)        at android.view.ViewRootImpl.setView(ViewRootImpl.java:525)        at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:269)        at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)        at android.widget.Toast$TN.handleShow(Toast.java:402)        at android.widget.Toast$TN$1.run(Toast.java:310)        at android.os.Handler.handleCallback(Handler.java:730)        at android.os.Handler.dispatchMessage(Handler.java:92)        at android.os.Looper.loop(Looper.java:137)        at android.app.ActivityThread.main(ActivityThread.java:5103)        at java.lang.reflect.Method.invokeNative(Native Method)        at java.lang.reflect.Method.invoke(Method.java:525)        at       com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)        at dalvik.system.NativeStart.main(Native Method)

它发生在我需要维护的一个大老项目中,而这个浮动错误仅在几个小时后才发生。我花了很多时间,还读了一些关于SO的相关答案,除了它是Android的系统级错误外,没有任何线索,应该有一些额外的数据或内存中对象或大对象的重复等:

https://pre.google.com/p/android/issues/detail?id=32470

我能想到的最后一件事是SoundPool。它在项目中使用不多-有时会播放不超过10种不同的声音。
但这是根本原因!有时,SoundPool中有浮动的异常

"unable to load sample (null)"

。它有助于意识到SoundPool的使用方式有误:

public void play(int rscId) {...    final int soundId = soundPool.load(mContext, rscId, 1);    ...    soundPool.play(soundId, volume, volume, 5, 0, 1f);

因此,每次调用播放声音方法的应用程序都会生成新的ID,并重新加载声音资源!在一定时间后,一些不相关的异常开始发生,直到应用程序崩溃并

"Couldnot read input channel file descriptors from parcel"
引发异常。
有趣的是,这些不相关的异常之一是
"ExceptionHandled in unable to open database file (pre 14)"

ExceptionHandled in unable to open database file (pre 14)android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file (pre 14)at android.database.sqlite.SQLiteConnection.nativeExecuteForCursorWindow(Native Method)at android.database.sqlite.SQLiteConnection.executeForCursorWindow(SQLiteConnection.java:845)

当然,它与数据库或吐司/包裹均无关。针对特定情况的修复非常容易:只需按照Android文档中的建议预加载所有声音即可:

http://developer.android.com/reference/android/media/SoundPool.html

“加载逻辑会在调用适当声音的列表中进行迭代

SoundPool.load()function
。通常应在过程的早期完成此操作,以留出时间将音频解压缩为原始PCM格式,然后再进行播放。
一旦加载声音并开始播放, ,应用程序可以通过调用触发声音
SoundPool.play()
。”

所以我感动

soundPool.load() out from play() method
了一个例外:例外
"Could not read input channel file descriptors from parcel"
也已经消失了
"unable toopen database file (pre 14)"

public void play(int soundId) {    ...    soundPool.play(soundId, volume, volume, 5, 0, 1f);

并且

soundPool.release(); soundPool = null

在不再需要时也应该调用它。也许它也会对此类异常产生影响,请参见此处的详细信息

http://codingdict.com/questions/121413

最有可能不是原始问题的确切情况,但希望它可以提供一些信息以供进一步研究。即寻找一些其他异常,可吞咽的异常或错误的文件/数据处理。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/453533.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号