7

我一直在使用工具leacanary来发现我的应用程序中的内存泄漏。似乎我的 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
  • 安卓版本:5.1 API:22
  • 持续时间:watch=5139ms, gc=188ms, heap dump=2822ms, analysis=30918ms

感谢是否有人可以提供帮助。谢谢!

4

1 回答 1

0
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 设为私有。

于 2015-11-30T03:45:34.100 回答