【问题标题】:LeakCanary spots Android WebView memory leakLeakCanary 发现 Android WebView 内存泄漏
【发布时间】:2015-05-14 21:41:30
【问题描述】:

我一直在使用工具 leakcanary 来发现我的应用程序中的内存泄漏。看来我的 WebViewActivity 每次都会泄漏。

我创建了一个简单的应用程序来测试泄漏。我使用 xml 布局文件中的 WebView 启动一个活动/使用活动上下文膨胀。关掉。一切默认都期望一个简单的 webViewClient 在 WebView 中保持重定向。每次都会漏水。

我已经做了大量的研究,防止这种情况的唯一方法是使用另一个进程启动 WebViewActivity 并在 onDestroy 中将其杀死。但是这种方法也有自己的缺点。

在我所有运行 5.0+ 的设备上每次都会发生泄漏,尚未检查 4.3 及以下版本。

泄漏信息粘贴在下面:

在 com.example.webviewmemoryleaktest:1.0:1 中。 * com.example.webviewmemoryleaktest.WebViewActivity 已泄露: * GC ROOT android.os.ResultReceiver$MyResultReceiver.this$0 * 引用 org.chromium.content.browser.ContentViewCore$2$1.this$1(匿名类扩展 android.os.ResultReceiver) * 参考 org.chromium.content.browser.ContentViewCore$2.this$0 * 参考 org.chromium.content.browser.ContentViewCore.mContext * 参考 com.android.webview.chromium.ResourcesContextWrapperFactory$WebViewContextWrapper.mBase * 泄露 com.example.webviewmemoryleaktest.WebViewActivity 实例

  • 参考密钥:9a0346cf-6ad9-4b07-9329-a975d8fa3cbe
  • 设备:LGE google Nexus 4 occam
  • Android 版本:5.1 API:22
  • 持续时间:watch=5139ms, gc=188ms, heap dump=2822ms, analysis=30918ms

如果有人可以提供帮助,不胜感激。谢谢!

【问题讨论】:

标签: android memory-leaks webview garbage-collection leakcanary


【解决方案1】:
private ResultReceiver mResultReceiver = new ResultReceiver(new Handler()) {
    @Override
    public void onReceiveResult(int resultCode, Bundle resultData) {
        getContentViewClient().onImeStateChangeRequested(
                resultCode == InputMethodManager.RESULT_SHOWN
                || resultCode == InputMethodManager.RESULT_UNCHANGED_SHOWN);
        if (resultCode == InputMethodManager.RESULT_SHOWN) {
            // If OSK is newly shown, delay the form focus until
            // the onSizeChanged (in order to adjust relative to the
            // new size).
            // TODO(jdduke): We should not assume that onSizeChanged will
            // always be called, crbug.com/294908.
            getContainerView().getWindowVisibleDisplayFrame(
                    mFocusPreOSKViewportRect);
        } else if (hasFocus() && resultCode
                == InputMethodManager.RESULT_UNCHANGED_SHOWN) {
            // If the OSK was already there, focus the form immediately.
            assert mWebContents != null;
            mWebContents.scrollFocusedEditableNodeIntoView();
        }
    }
};

@Override
public ResultReceiver getNewShowKeyboardReceiver() {
    return mResultReceiver;
}

将 mResultReceiver 设为私有。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    相关资源
    最近更新 更多