我已经为
Android创建了一个或多或少类似的应用程序:
>应用程序与Web服务通信并传输信息(而不是文件)
>我可以使用Intent和startActivity导航到不同的屏幕
不幸的是,有时应用程序在不同的活动中崩溃并出现以下错误:
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:135) at android.view.IWindowSession$Stub$Proxy.add(IWindowSession.java:523) at android.view.ViewRootImpl.setView(ViewRootImpl.java:481) at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:301) at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215) at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140) at android.view.Window$LocalWindowManager.addView(Window.java:537) at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2507) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1986) at android.app.ActivityThread.access$600(ActivityThread.java:123) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4424) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) at dalvik.system.NativeStart.main(Native Method)
解决方法
此问题似乎与
Could not read input channel file descriptors from parcel相同,后者(错误地)关闭为非主题.它与
Could not read input channel file descriptors from parcel crash report或多或少相同.不幸的是,这些问题没有得到令人满意的(并且足够普遍)的答案,所以无论如何我都要尝试.
文件描述符在Android中的多个位置使用:
>套接字(是的,开放的网络连接也是“文件”);
>实际文件(不一定是磁盘上的文件,也可能是android.os.MemoryFile实例);
> Pipes-Linux在任何地方都使用它们,例如,导致异常的尝试打开管道,可能需要在IME(键盘)进程和您的应用程序之间发送输入事件.
所有描述符均以shared maximum limit为准;当超过该数量时,您的应用程序开始遇到严重问题.在这种情况下,使进程死亡是最佳方案,因为否则内核将耗尽内存(文件描述符存储在内核内存中).
您可能会遇到没有关闭描述符(文件,网络连接)的问题.你必须尽快关闭它们.您可能还遇到内存泄漏问题 – 对象在应该进行垃圾收集时(而某些泄漏的对象可能会依次保留在文件描述符上).
您自己的代码不必是有罪的,您使用的库甚至一些系统组件可能有错误,导致内存泄漏和文件描述符泄漏.我建议你使用Square’s Leak Canary-一个简单易用的库来自动检测泄漏(好吧,至少是内存泄漏,这是最常见的).