2015-05-14 12 views
7

रिसाव मैं अपने आवेदन में स्मृति लीकेज का पता करने के लिए एक उपकरण leakcanary उपयोग कर रहे हैं। ऐसा लगता है कि मेरी वेबव्यूएक्टिविटी हर बार लीक होती है।LeakCanary स्पॉट Android WebView, स्मृति

मैंने रिसावों का परीक्षण करने के लिए एक सरल आवेदन बनाया। मैं xml लेआउट फ़ाइल/गतिविधि संदर्भ के साथ inflate के अंदर एक वेबव्यू के साथ एक गतिविधि शुरू करते हैं। जेएस ऑफ सबकुछ डिफ़ॉल्ट वेबव्यू के भीतर एक सरल वेब व्यू क्लाइंट रीडायरेक्शन रखने की अपेक्षा करता है। यह हर बार रिसाव करता है।

मैं अनुसंधान के बहुत सारे किया है, इसे रोकने के लिए एक ही रास्ता किसी अन्य प्रक्रिया के साथ WebViewActivity शुरू करने और OnDestroy अंदर मारने है। लेकिन इस विधि के अपने नुकसान हैं।

रिसाव मेरे सारे 5.0+ चलाने वाले डिवाइस पर हर बार होता है, 4.3 और नीचे के साथ की जाँच नहीं की है।

रिसाव की जानकारी नीचे चिपकाया जाता है: 1.0:

com.example.webviewmemoryleaktest में 1। * com.example.webviewmemoryleaktest.WebViewActivity लीक हो गया है: * जी सी जड़ android.os.ResultReceiver $ MyResultReceiver.this $ 0 * संदर्भ $ 2 $ 1. इस $ 1 org.chromium.content.browser.ContentViewCore (अनाम वर्ग android.os फैली .ResultReceiver) * संदर्भ org.chromium.content.browser.ContentViewCore $ 2. इस $ 0 * संदर्भ org.chromium.content.browser.ContentViewCore.mContext * संदर्भ com.android.webview.chromium.ResourcesContextWrapperFactory $ WebViewContextWrapper.mBase * com.example.webviewmemoryleaktest.WebViewActivity उदाहरण लीक

  • संदर्भ कुंजी: 9a0346cf-6ad9-4b07-9329-a97 5d8fa3cbe
  • डिवाइस: LGE गूगल नेक्सस 4 occam
  • एंड्रॉयड संस्करण: 5.1 एपीआई: 22
  • अवधियां: = 5139ms, जीसी = 188ms, हीप डंप = 2822ms, घड़ी विश्लेषण = 30918ms

अगर कोई मदद कर सकता है तो सराहना करें। धन्यवाद!

+0

https://github.com/square/leakcanary/issues/92#issuecomment-102181372 - वे एंड्रॉयड ढांचे कोड के आधार पर लीक से निपटने के लिए एक प्रलेखित कार्यप्रणाली की है। यह भी शामिल है [लीक कैनरी दस्तावेज में] (https://github.com/square/leakcanary#my-leak-is-caused-by-the-android-sdk-implementation)। – CommonsWare

+0

क्या आप 'WebView.destroy() '[doc] (http://developer.android.com/reference/android/webkit/WebView.html#destroy()) पर कॉल करते हैं, जब आपको अब WebView की आवश्यकता नहीं होती है और इसे हटा दिया जाता है दृश्य पदानुक्रम? –

+0

हां, मैंने mWebView.destroy()/mWebView = null/mWebView.load (लगभग: खाली) किया है, उनमें से कोई भी मेरे लिए काम नहीं करता है। –

उत्तर

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 निजी होने के लिए बनाते हैं।

संबंधित मुद्दे