2016-01-06 12 views
6

Sto cercando di individuare una perdita nella mia app ma non sono sicuro che provenisse da questa.Perdita di leak leakage in InputMethodManager

LeakCanary mi sta dicendo che posso ignorarlo. È giusto?

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 

Si sono verificate diverse perdite causate da questo frammento, ma le ho risolte. Questo non posso farlo scomparire.

Qualsiasi indizio?

EDIT

Una cosa di più, se voglio ignorarlo questo dovrebbe essere sufficiente?

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

Ma è ancora mostrando in LeakCanary

A quanto pare questo perdite è in AndroidExcludeRef ma ancora sono stati segnalati. https://github.com/square/leakcanary/issues/322

+0

Ci sono varie soluzioni o soluzioni alternative: https://issuetracker.google.com/issues/37043700#comment17 https://issuetracker.google .com/issues/36950938 https://stackoverflow.com/questions/5038158/main-activity-is-not-garbage-collected –

risposta

2

Sì, puoi ignorare questa perdita.

Verificare ad esempio questo problema: https://github.com/square/leakcanary/issues/256

+0

la cosa strana è quando ignoro ottengo altri come questo. Sempre proveniente da questo frammento – Marcel

+0

Si tratta di un bug dal framework Android e probabilmente è già segnalato (e risolto nelle prossime versioni di Android). Quindi non puoi fare qualcosa per il problema, quindi dovresti ignorarlo. –

+0

L'ho capito, ma mi sembra strano che quando ignoro questo, ne ottengo uno nuovo da un ascoltatore in un pulsante ... – Marcel

0

LeakCanary è già prendere questa perdita come un errore di sistema operativo Android. Ma sta ancora succedendo, cosa mi ha infastidito. Se qualcuno entra in questo e vuole ripararlo, c'è una soluzione alternativa.

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

basta chiamare l'onCreate della vostra attività questo

IMMLeaks.fixFocusedViewLeak(getApplication()); 
1

Sì, è possibile ignorare questa perdita, ma dopo tutto, una fuga è uno scenario indesiderabile che dovremmo cercare di risolvere il problema utilizzando qualsiasi hack o trucco.

Una soluzione elegante per perdite sopra il quale funziona per tutte le versioni è here

+0

Ma questa soluzione ha un effetto collaterale sullo schermaggio dello "screenshot" della tua app, quando viene premuto il pulsante App recenti. Lo screenshot dell'app verrà visualizzato come uno schermo bianco nero (o bianco) anziché mostrare il contenuto dello schermo effettivo. Questo nonostante il DummyActivity sia completamente trasparente. –