7

Ich habe das Tool leakcanary verwendet, um Speicherlecks in meiner Anwendung zu erkennen. Es scheint, dass meine WebViewActivity jedes Mal leckt.LeakCanary Flecken Android WebView Speicherleck

Ich habe eine einfache Anwendung zum Testen der Leckagen erstellt. Ich starte eine Aktivität mit einem WebView innerhalb der XML-Layoutdatei/mit Aktivitätskontext aufblasen. Js aus. Alles Standard erwartet einen einfachen WebViewClient, der die Umleitung innerhalb des WebView hält. Es leckt jedes Mal.

Ich habe viel Forschung getan, die einzige Möglichkeit, dies zu verhindern, ist WebViewActivity mit einem anderen Prozess zu starten und es in OnDestroy zu töten. Aber diese Methode hat ihre eigenen Nachteile.

Das Leck passiert jedes Mal auf allen Geräten mit 5.0+, nicht mit 4.3 und darunter überprüft.

In com.example.webviewmemoryleaktest:

Das Leck info wird unten eingefügt 1,0: 1. * com.example.webviewmemoryleaktest.WebViewActivity hat durchgesickert: * GC ROOT android.os.ResultReceiver $ MyResultReceiver.this $ 0 * Referenzen $ 2 $ 1.this von $ 1 (anonyme Klasse org.chromium.content.browser.ContentViewCore erstreckt android.os .ResultReceiver) * Referenzen org.chromium.content.browser.ContentViewCore 2.this $ 0 $ * Referenzen org.chromium.content.browser.ContentViewCore.mContext * Referenzen com.android.webview.chromium.ResourcesContextWrapperFactory $ WebViewContextWrapper.mBase * Lecks com.example.webviewmemoryleaktest.WebViewActivity Instanz

  • Referenzschlüssel: 9a0346cf-6ad9-4b07-9329-a97 5d8fa3cbe
  • Gerät: LGE Google Nexus 4 occam
  • Android Version: 5.1 API: 22
  • Dauern: watch = 5139ms, gc = 188ms, Heapdump = 2822ms, Analyse = 30918ms

Schätze, wenn jemand helfen könnte. Vielen Dank!

+0

https://github.com/square/leakcanary/issues/92#issuecomment-102181372 - Sie verfügen über ein dokumentiertes Verfahren zum Umgang mit Lecks auf der Basis von Android-Framework-Code. Dies wird auch in der LeakCanary-Dokumentation behandelt (https://github.com/square/leakcanary#my-leak-is-cracted-by-the-android-sdk-implementation). – CommonsWare

+0

Rufen Sie 'WebView.destroy()' [doc] (http://developer.android.com/reference/android/webkit/WebView.html#destroy()) auf, wenn Sie WebView nicht mehr benötigen und es entfernt haben die Sichtenhierarchie? –

+0

Ja, ich habe mWebView.destroy()/mWebView = null/mWebView.load (etwa: leer), keiner von ihnen funktioniert für mich. –

Antwort

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

machen mResultReceiver zu privat sein.