使用资产时Android WebView内存泄漏

时间:2012-02-14 13:57:43

标签: java android html html5 webview

我最近注意到,当我从文件(使用资源或本地目录)加载基于代码的webview时,一旦调用destroy()方法,WebView就会泄漏内存。我已将其缩小到引用问题。程序/ webview会复制原始视图并丢失JNI表中的引用 - 这最终会导致程序在512个条目后崩溃。

我已经看过这篇文章了,但是非泄漏的webview修复似乎不适用于资产或外部文件夹中的HTML。

Memory leak in WebView

当应用程序完全基于服务器时,问题不存在;但是,我需要应用程序能够“同步”数据并使用这些视图更新脱机存储库。

更多信息:我已将网页视图放入ViewPager中以允许滚动。这个问题在3.2.4 / 1中不存在,但已出现在4.0.3中。我收到了很多JNI警告,(找不到条目)并且在视图被销毁后它们仍然存在。我通过hprof看了它,我注意到HTML在丢失的变量中保留了残余。

有关如何纠正此行为的任何说明将不胜感激。

编辑:

崩溃的细节

Failed adding to JNI local ref table (has 512 entries)
"Thread-375" prio=5 tid=15 RUNNABLE
| group="main" sCount=0 dsCount=0 obj=0x41504a90 self=0x1a9cf80
| sysTid=10314 nice=0 sched=0/0 cgrp=default handle=27159240
| schedstat=( 455083000 66745000 774 ) utm=30 stm=15 core=3

at android.content.res.AssetManager.readAsset(Native Method)
at android.content.res.AssetManager.access$700(AssetManager.java:35)
at android.content.res.AssetManager$AssetInputStream.read(AssetManager.java:573)
at dalvik.system.NativeStart.run(Native Method)

更新:

要解决此问题,您必须从SD卡或其他存储机制加载。当加载Javascript文件时,该错误是永久性的,我不知道它是否已在Chrome中修复,但在最新操作系统中似乎没有在浏览器中修复。

1 个答案:

答案 0 :(得分:1)

.destroy() - >破坏此WebView的内部状态。在从视图系统中删除此WebView之后,应调用此方法。