2016-01-06 9 views
6

Ich versuche es herauszufinden, ein Leck in meiner App, aber ich bin mir nicht sicher, woher das kommt.LeakCanary Bericht Leck in InputMethodManager

LeakCanary sagt mir, dass ich es ignorieren kann. Ist das richtig?

01-06 12:04:56.580 6935-9159/com.mypackage D/LeakCanary: * LEAK CAN BE IGNORED. 
01-06 12:04:56.580 6935-9159/com.mypackage D/LeakCanary: * com.mypackage.ui.map.MapComponentFragment has leaked: 
01-06 12:04:56.580 6935-9159/com.mypackage D/LeakCanary: * GC ROOT android.view.inputmethod.InputMethodManager$1.this$0 (anonymous class extends com.android.internal.view.IInputMethodClient$Stub) 
01-06 12:04:56.580 6935-9159/com.mypackage D/LeakCanary: * references android.view.inputmethod.InputMethodManager.mCurRootView 
01-06 12:04:56.580 6935-9159/com.mypackage D/LeakCanary: * references com.android.internal.policy.impl.PhoneWindow$DecorView.mContext 
01-06 12:04:56.580 6935-9159/com.mypackage D/LeakCanary: * references com.mypackage.ui.MainActivity.mFragments 
01-06 12:04:56.580 6935-9159/com.mypackage D/LeakCanary: * references android.app.FragmentManagerImpl.mAdded 
01-06 12:04:56.580 6935-9159/com.mypackage D/LeakCanary: * references java.util.ArrayList.array 
01-06 12:04:56.580 6935-9159/com.mypackage D/LeakCanary: * references array java.lang.Object[].[0] 
01-06 12:04:56.580 6935-9159/com.mypackage D/LeakCanary: * leaks com.mypackage.ui.map.MapComponentFragment instance 
01-06 12:04:56.580 6935-9159/com.mypackage D/LeakCanary: * Reference Key: 0790f013-1c87-4d5f-8c10-db277187e3ce 
01-06 12:04:56.580 6935-9159/com.mypackage D/LeakCanary: * Device: samsung samsung SM-N910C treltexx 
01-06 12:04:56.580 6935-9159/com.mypackage D/LeakCanary: * Android Version: 5.1.1 API: 22 LeakCanary: 1.4-SNAPSHOT 2714152 
01-06 12:04:56.580 6935-9159/com.mypackage D/LeakCanary: * Durations: watch=5085ms, gc=149ms, heap dump=2562ms, analysis=10313ms 

Es gab mehrere Lecks durch dieses Fragment, aber ich repariere sie. Diesen kann ich nicht verschwinden lassen.

Irgendwelche Hinweise?

EDIT

Eine weitere Sache, wenn ich es ignorieren möchte, sollte dies ausreichen?

.instanceField("android.view.inputmethod.InputMethodManager", "mCurRootView") 

aber zeigt noch in LeakCanary bis

Offenbar dieses Leck in AndroidExcludeRef ist aber nach wie vor berichtet. https://github.com/square/leakcanary/issues/322

+0

Es gibt verschiedene Lösungen oder Lösungen: https://issuetracker.google.com/issues/37043700#comment17 https://issuetracker.google .com/issues/36950938 https://stackoverflow.com/questions/5038158/main-activity-is-not-garbage-collected –

Antwort

2

Yup, Sie können dieses Leck ignorieren.

prüfen zum Beispiel dieses Problem: https://github.com/square/leakcanary/issues/256

+0

die komische Sache ist, wenn ich ignoriere ich bekomme andere so. Kommt immer von diesem Fragment – Marcel

+0

Es ist ein Bug aus dem Android-Framework und wahrscheinlich ist bereits gemeldet (und in den nächsten Versionen von Android behoben). Sie können also nichts gegen das Problem unternehmen, also sollten Sie es ignorieren. –

+0

Ich habe das verstanden, aber immer noch komisch, dass, wenn ich dieses ignoriere, ich ein neues von einem Zuhörer in einem Knopf bekomme ... – Marcel

0

LeakCanary ist nehmen bereits diese undichte Stelle als Fehler Android OS. Aber immer noch passiert, was mich verärgert hat. Wenn jemand in dieses Problem eindringt und es beheben möchte, gibt es einen Workaround dafür.

https://gist.github.com/pyricau/4df64341cc978a7de414

Rufen Sie einfach an der onCreate Ihrer Aktivität dieser

IMMLeaks.fixFocusedViewLeak(getApplication()); 
1

Ja, Sie dieses Leck ignorieren können, aber immerhin ein Leck ist ein unerwünschtes Szenario, das wir versuchen sollten, mit jedem zu beheben hacken oder trick.

Eine elegante Lösung für über undichte Stelle, die für alle Versionen arbeiten ist here

+0

Aber diese Lösung hat einen Nebeneffekt, den "Screenshot" deiner App zu verpfuschen, wenn die Schaltfläche "Letzte Apps" gedrückt wird. Ihr App-Screenshot wird als leerer schwarzer (oder weißer) Bildschirm angezeigt, anstatt den tatsächlichen Bildschirminhalt anzuzeigen. Dies obwohl die DummyActivity vollständig transparent ist. –