2015-05-14 21 views
7

Używam narzędzia leakcanary do wykrywania wycieków pamięci w mojej aplikacji. Wygląda na to, że mój WebViewActivity przecieka za każdym razem.LeakCanary spotykane wycieki pamięci Web Web View

Stworzyłem prostą aplikację do testowania wycieków. Rozpoczynam działanie z WebView wewnątrz pliku układu XML/zawyżam z kontekstem działania. Js off. Wszystko domyślnie oczekuje prostego webViewClient utrzymującego przekierowanie w WebView. Przecieka za każdym razem.

Zrobiłem wiele badań, jedynym sposobem, aby temu zapobiec, jest uruchomienie WebViewActivity z innym procesem i zabicie go w witrynie Demestroy. Ale ta metoda ma swoje wady.

Przeciek pojawia się za każdym razem na wszystkich urządzeniach z systemem 5.0+, nie sprawdzono z 4.3 i poniżej.

Przeciek informacji zostanie wklejony poniżej:

W com.example.webviewmemoryleaktest: 1,0: 1. * com.example.webviewmemoryleaktest.WebViewActivity wyciekło: * GC ROOT android.os.ResultReceiver $ MyResultReceiver.this $ 0 * odnosi się do org.chromium.content.browser.ContentViewCore 2 $ 1 $ 1. ten 1 $ (anonimowa klasa rozszerza android.os .ResultReceiver) * referencje org.chromium.content.browser.ContentViewCore $ 2.Niniejsze $ 0 * referencje org.chromium.content.browser.ContentViewCore.mContext * referencje com.android.webview.chromium.ResourcesContextWrapperFactory $ WebViewContextWrapper.mBase * przecieki instancję com.example.webviewmemoryleaktest.WebViewActivity

  • Reference kluczowe: 9a0346cf-6ad9-4b07-9329-A97 5d8fa3cbe
  • Urządzenie: LGE pomocną Nexus 4 Occam
  • Android wersja 5.1 API 22
  • Czasy trwania: oglądać = 5139ms GC = 188ms, stos zrzutu = 2822ms, analiza = 30918ms

Doceń, czy ktoś może pomóc. Dzięki!

+0

https://github.com/square/leakcanary/issues/92#issuecomment-102181372 - mają udokumentowaną procedurę postępowania w przypadku wycieków w oparciu o kod systemu Android. Obejmuje to również [w dokumentacji LeakCanary] (https://github.com/square/leakcanary#my-leak-is-caused-by-the-android-sdk-implementation). – CommonsWare

+0

Czy nazywasz 'WebView.destroy()' [doc] (http://developer.android.com/reference/android/webkit/WebView.html#destroy()), gdy nie potrzebujesz już WebView i usunąłeś go z hierarchia widoków? –

+0

Tak, zrobiłem mWebView.destroy()/mWebView = null/mWebView.load (about: blank), żaden z nich nie działa dla mnie. –

Odpowiedz

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; 
} 

spraw, aby mResultReceiver był prywatny.