2011-04-24 7 views
13

La jerarquía de vista es la siguiente TabActivity ->ActivityGroups ->Activities.InputMethodManager guarda referencia al tabhost - Pérdida de memoria - OOM Error

Usando MAT encontré que TabWidget es referenciado por TabHost que se hace referencia por InputMethodManager, por lo tanto TabWidget se filtró. En el lanzamiento posterior de la aplicación, se lanza OutOfMemory Error.

Del mismo modo todas mis actividades también se mencionan en InputMethodManager. (Después de cerrar la aplicación a todos mis grupos de actividades, las actividades, tabactivity, tabhost y TabWidget se filtraron !!)

Al terminar correctamente la aplicación (golpear tecla de retroceso), se muestra en la siguiente Logcat

WARN/InputManagerService (99): a partir de la entrada en [email protected] no centrada en el cliente (uid = 10052 pid = 1463)

Cómo quitar la referencia de InputMethodManager .. .?

cosa que probé:

A. llama a este método onDestroy de mi TabActivity
1. myTabWidget.removeAllViews()
2. myTabWidger.invalidate()

No Luck!


Respuesta

1

cosa que probé: A. llama a este método OnDestroy de mi TabActivity 1.myTabWidget.removeAllViews() 2.myTabWidger.invalidate()

Por supuesto, no funcionará. Las actividades no son vistas ni en MVC/MVP/MVVM ni en la jerarquía de clases de Android SDK. android.app.Activity no extiende android.view.View

Mi colega tenía un problema similar con pérdidas de memoria - declaró tabHost en TabActivity de manera estática (quería acceder a él desde otra actividad, cuando no lo había hecho) estado familiarizado con el patrón Observer). Creo que has hecho algo similar.

Y, por último, mi pregunta: ¿por qué hace referencia a las actividades en InputMethodManager (aunque no entiendo cómo: es la clase final) y no InputMethodManager en las actividades? Si desea un punto de enfoque global para InputMethodManager, puedo aconsejarle que coloque una referencia en la clase de aplicación. Extendemos la clase de aplicación (por ejemplo, HostApplication), en esta fachada declaramos cosas comunes (SharedPreferences, por ejemplo). Y en las actividades que escribimos:

HostApplication application = (HostApplication) getApplication(); 

Luego obtenemos cosas útiles de ella.

+0

no me refiero InputMethodManager de todos modos. ¿Puede proporcionarme un enlace que explique más sobre "pattern Observer"? – Mani

+1

http://en.wikipedia.org/wiki/Observer_pattern Creamos un modelo como Observable (Asunto) y las Actividades eran Observadores (implementaron la interfaz "Observador"). Al comienzo, la actividad se registró en el modelo (usamos singleton, pero puede usar Service o Application). Si hubo algo interesante, evento disparado observable y notificado a cada cliente. Antes de destruir, la actividad no se registró en Observable para evitar la pérdida de memoria. La mayoría de las causas de pérdida de memoria en Android son muy simples: Contexto/Vista/Diálogo se declararon de manera estática en alguna parte. – QuickNick

3

También encontré este problema e intenté evitarlo de alguna manera.Cuando finalice mi actividad, trato de cortar la conexión con el servicio administrador de métodos de entrada. Échale un vistazo:

class MyActivity extend Activity { 
    @Override 
    public void finish() { 
     InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
     imm.windowDismissed(mContentView.getWindowToken()); 
     super.finish(); 
    } 
} 

No estoy seguro de si esto podría solucionar esta fuga de memoria. Por ahora, funciona bien. Podrías intentarlo.

+1

mContentView, ¿es la referencia a la vista raíz de tablayout? – Mani

+0

InputMethodManager.windowDismissed es un método oculto en la API de Android. Entonces, no, no funciona bien. Para que funcione, debe usar reflection: '((Class.forName (" android.view.inputmethod.InputMethodManager ")). GetMethod (" windowDismissed ", IBinder.class)). Invoke (null, mContentView.getWindowToken()); ' – iamreptar

1

¿Estás seguro de que la pérdida de memoria es real? Tengo una situación similar, y aunque parece una pérdida de memoria en MAT, no puedo obtener dos instancias de TabActivity para que aparezca debido a InputMethodManager. Claro, el InputMethodManager parece mantener la TabActivity de la recolección de basura. Pero, si esto fuera una verdadera pérdida de memoria, ¿no podría ver dos TabActivites, luego tres, luego cuatro?

(FYI, yo era capaz de ver dos TabActivities en un punto, pero el problema no era el InputMethodManager, era una referencia estática en el código)

+0

Sí, tienes razón. InputMethoManage no hace nada. El problema es con una referencia estática que utilicé para cambiar la pestaña seleccionada. En la respuesta anterior, "QuickNick" ha mencionado cómo eliminar la referencia estática usando el patrón obeserver. – Mani

Cuestiones relacionadas