首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LeakCanary发现Android WebView内存泄漏

LeakCanary发现Android WebView内存泄漏
EN

Stack Overflow用户
提问于 2015-05-14 21:41:30
回答 1查看 2.3K关注 0票数 7

我一直在使用一个工具漏金丝雀来识别我的应用程序中的内存泄漏。好像每次我的WebViewActivity都会泄露。

我创建了一个简单的应用程序来测试泄漏。我使用xml布局文件中的WebView启动一个活动/使用活动上下文进行充气。Js关了。默认情况下,都期望有一个简单的webViewClient,在WebView中保持重定向。每次都会泄露。

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

在我所有运行5.0+的设备上,每次都会发生泄漏,但是还没有检查一下4.3或更低的版本。

泄漏信息粘贴在下面:

在com.example.webviewMemyletest:1.0:1.* com.example.webviewmemoryleaktest.WebViewActivity泄露了:* GC根android.os.ResultReceiver$MyResultReceiver.this$0 * references org.chromium.content.browser.ContentViewCore$2$1.this$1 (匿名类扩展android.os.ResultReceiver) * references org.chromium.content.browser.ContentViewCore$2.this$0 * references org.chromium.content.browser.ContentViewCore.mContext * references 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,堆dump=2822ms,analysis=30918ms

如果有人能帮忙的话。谢谢!

EN

回答 1

Stack Overflow用户

发布于 2015-11-30 03:45:34

代码语言:javascript
复制
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成为私有的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30247857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档