【问题标题】:Android WebView with JavascriptInterface - Memory Leak?带有 JavascriptInterface 的 Android WebView - 内存泄漏?
【发布时间】:2014-04-18 14:04:06
【问题描述】:

我正在开发自定义浏览器,它能够像普通浏览器一样打开更多选项卡。我的浏览器活动由 ViewPager 组成。标签在 Fragments 中实现 - 每个 WebView 在 ViewPager 中都有自己的片段(标签)。选项卡在 ViewPager 中动态添加/删除。

分析内存转储我发现,从寻呼机中删除的 WebFragments 不是垃圾收集并留在内存中。从内存分析的角度来看,我使用传入引用列出我的 WebFragments,然后使用选项“合并到 GC 根的最短路径”->“排除所有幻象/弱/软等引用”。这就是我所看到的:

顶部的“App”是我的应用程序上下文,在底部你可以看到我泄露的WebFragment及其上方的javascript接口(JSInterface)。

我以标准方式在 WebFragment 中添加我的 JSInterface:

webView.addJavascriptInterface(new JSInterface(), JSInterface.JSINTERFACE_NAME);

(JSInterface是WebFragment中的私有类)

JS 接口会导致我的 WebFragment 泄漏吗?我怎样才能摆脱它?谢谢!

【问题讨论】:

  • 可能您的JSInterface 引用了上下文?
  • 不,JSInterface 不引用任何对象,除非它的 WebFragment 需要能够与之合作(参见 curtisLoew 的回答)

标签: android android-fragments memory-leaks webview


【解决方案1】:

显然,WebKit 部分仍然引用了您的 javascript 界面。

调用removeJavaScriptInterface(JSInterface.JSINTERFACE_NAME); 明确取消引用它。

【讨论】:

  • 我将 JSInterface 实现为单独的类,然后我还设法通过将 JSInterface 对它的引用设置为空来收集 WebFragments 垃圾,但是现在当我调用 removeJavaScriptInterface 时,JSInterfaces 似乎也被泄露了......我会多研究,谢谢。另一个缺点是 removeJavaScriptInterface 至少需要 Honeycomb...
【解决方案2】:

尝试将JSInterface设为静态。

【讨论】:

  • 为什么不应该在评论中?
  • @code-jaff 我相信这是对该问题的潜在答案,因此不是合适的评论。
  • 不幸的是它没有帮助。 :-( 为了使其成为静态,我必须在 JSInterface 类中引用 WebFragment 才能与其功能、webview 等配合......但情况是一样的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
  • 2018-06-28
  • 2011-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多