加载太多javascript时android phonegap应用程序失败

Posted

技术标签:

【中文标题】加载太多javascript时android phonegap应用程序失败【英文标题】:android phonegap application fails when loading too much javascript 【发布时间】:2010-11-08 01:05:03 【问题描述】:

我有一个基于 Web 2.0 技术的应用程序——基本上我使用 phonegap / Titan 方法来启动一个 Web 浏览器,其中大部分应用程序是用 javascripthtml(更准确地说是 jQuery)编写的。该应用程序在模拟器上运行良好,但是当我在 G1 上启动它时,它崩溃了。当我减少为应用程序编写的 javascript 数量时,它又开始工作了。或者,如果我删除 javascriptInterface 以访问一些基于“java”的方法,该应用程序也可以工作。

当我尝试加载应用程序所需的所有 javascript 和 java 对象时,它会崩溃(如下面的日志所示)。我可以在 Webkit 中加载的“代码”内存量是否有硬性限制?疯狂的是,这个应用程序使用了很多图像,加载得很好.. 似乎我在允许解析和加载到 Webkit 的 javascript 行数上遇到了一些限制?它确实说“打开的文件太多”,这可能是问题所在,但我实际上并没有用我的应用程序打开任何文件,所以我对这个错误感到困惑。

感谢您的帮助。过去几天我一直在为此苦苦挣扎。

07-03 16:43:23.430: DEBUG/dalvikvm(104): GC freed 964 objects / 41632 bytes in 285ms
07-03 16:43:24.030: DEBUG/dalvikvm(314): GC freed 710 objects / 23680 bytes in 131ms
07-03 16:43:24.380: INFO/ActivityManager(62): Process android.process.im (pid 220) has died.
07-03 16:43:24.650: DEBUG/dalvikvm(104): GC freed 964 objects / 41688 bytes in 154ms
07-03 16:43:24.700: ERROR/IMemory(104): cannot dup fd=1023, size=1048576, err=0 (Too many open files)
07-03 16:43:24.700: ERROR/IMemory(104): cannot map BpMemoryHeap (binder=0x4fe260), size=1048576, fd=-1 (Bad file number)
07-03 16:43:24.820: ERROR/JavaBinder(104): *** Uncaught remote exception!  (Exceptions are not yet supported across processes.)
07-03 16:43:24.820: ERROR/JavaBinder(104): java.lang.RuntimeException: No memory in memObj
07-03 16:43:24.820: ERROR/JavaBinder(104):     at android.database.CursorWindow.native_init(Native Method)
07-03 16:43:24.820: ERROR/JavaBinder(104):     at android.database.CursorWindow.<init>(CursorWindow.java:467)
07-03 16:43:24.820: ERROR/JavaBinder(104):     at android.database.CursorWindow.<init>(CursorWindow.java:27)
07-03 16:43:24.820: ERROR/JavaBinder(104):     at android.database.CursorWindow$1.createFromParcel(CursorWindow.java:442)
07-03 16:43:24.820: ERROR/JavaBinder(104):     at android.database.CursorWindow$1.createFromParcel(CursorWindow.java:445)
07-03 16:43:24.820: ERROR/JavaBinder(104):     at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:95)
07-03 16:43:24.820: ERROR/JavaBinder(104):     at android.os.Binder.execTransact(Binder.java:287)
07-03 16:43:24.820: ERROR/JavaBinder(104):     at dalvik.system.NativeStart.run(Native Method)

【问题讨论】:

我也遇到了类似的问题,但我的问题是我打开了游标,却从不关闭它们。我建议任何为此苦苦挣扎的人也看看他们是否在做同样的事情 【参考方案1】:

有时,当您不断通过模拟器重新安装应用程序时,您的手机可能会耗尽内存,因为 android 上的“取消链接”过程中存在错误

我遇到了这个错误:com.android.ddmlib.SyncException: Too many open files - 并且必须重新启动我的手机以释放内存。

希望您在开发期间只需执行一两次。 祝你好运!

【讨论】:

【参考方案2】:

原来与 javascript 有点无关。我从 java 中一次加载了太多的联系人,并且通过 javascript 桥暴露了这个大的 JSON 对象导致了内存问题。换句话说,当我有 1000 个联系人时,事情就会中断;其中 10 个联系人一切都很好——我认为这是 g1 特有的,因为问题没有出现在模拟器中;但我忽略了其他数量的联系人。

【讨论】:

【参考方案3】:

我会在你认为 android.process.im 死亡的地方设置一个断点并单步执行,直到你崩溃以隔离错误。

我的猜测是该进程死亡并且发生了一些导致级联错误的事情,因为该进程不再存在来处理错误('cannot dup/too many open files','Uncaught remote exception!(Exceptions not yet跨进程支持)。

【讨论】:

以上是关于加载太多javascript时android phonegap应用程序失败的主要内容,如果未能解决你的问题,请参考以下文章

如何仅在页面加载的 10% 时执行 JavaScript

php数组加载到javascript中

json编码在android中获取错误

如何使用 Javascript/jQuery 确定图像是不是已加载?

如何使用 Javascript/jQuery 确定图像是不是已加载?

从原生android发送数据到webview javascript页面重新加载网页