2015-05-14 17 views
7

Ho utilizzato uno strumento leakcanary per individuare perdite di memoria nella mia applicazione. Sembra che la mia WebViewActivity passi ogni volta.LeakCanary spots Perdita di memoria Android WebView

Ho creato una semplice applicazione per testare le perdite. Inizio un'attività con una WebView all'interno del file di layout xml/gonfia con il contesto delle attività. Js off. Tutto il valore predefinito prevede un semplice webViewClient che mantenga il reindirizzamento all'interno di WebView. Si perde ogni volta.

Ho fatto un sacco di ricerche, l'unico modo per impedire che questo è avviare WebViewActivity con un altro processo e ucciderlo dentro suDestroy. Ma questo metodo ha i suoi svantaggi.

La perdita si verifica ogni volta su tutti i miei dispositivi che eseguono 5.0+, non ho verificato con 4.3 e sotto.

Le informazioni perdita viene incollato sotto:

In com.example.webviewmemoryleaktest: 1,0: 1. * com.example.webviewmemoryleaktest.WebViewActivity è trapelato: * GC ROOT android.os.ResultReceiver $ MyResultReceiver.this $ 0 * riferimenti org.chromium.content.browser.ContentViewCore $ 2 $ 1.this $ 1 (classe anonima estende android.os .ResultReceiver) * riferimenti org.chromium.content.browser.ContentViewCore $ 2.this $ 0 * riferimenti org.chromium.content.browser.ContentViewCore.mContext * riferimenti com.android.webview.chromium.ResourcesContextWrapperFactory $ WebViewContextWrapper.mBase * perdite esempio com.example.webviewmemoryleaktest.WebViewActivity

  • chiave di riferimento: 9a0346cf-6ad9-4b07-9329-A97 5d8fa3cbe
  • dispositivo: LGE Google Nexus 4 Occam
  • Versione Android: 5.1 API: 22
  • Durate: guardare = 5139ms, GC = 188ms, heap dump = 2822ms, analisi = 30918ms

Apprezzo se qualcuno potrebbe aiutare. Grazie!

+0

https://github.com/square/leakcanary/issues/92#issuecomment-102181372 - hanno una procedura documentata per gestire le perdite in base al codice di framework Android. Questo è anche coperto [nella documentazione di LeakCanary] (https://github.com/square/leakcanary#my-leak-is-caused-by-the-android-sdk-implementation). – CommonsWare

+0

Chiama 'WebView.destroy()' [doc] (http://developer.android.com/reference/android/webkit/WebView.html#destroy()) quando non hai più bisogno di WebView e lo hai rimosso da la gerarchia delle visualizzazioni? –

+0

Sì, ho fatto mWebView.destroy()/mWebView = null/mWebView.load (circa: vuoto), nessuno di loro funziona per me. –

risposta

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

rendere mResultReceiver privato.