Problemas de memoria – fragmentos

Hace poco refactoreé una aplicación y reemplazé un ViewFlipper por FrameLayout en el que intercambiar entre Fragmentos.

Cada vez que el usuario solicita una de las vistas:

public void showLibraryOf(long publisherId) { library = new DownloadLibraryFragment(id, viewFactory()); FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.replace(R.id.container, library); ft.commit(); library.setAdapterObserver(this); } public void showMyLibraryOf(long publisherId) { myLibrary = new MyLibraryFragment(id, viewFactory()); FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.replace(R.id.container, myLibrary); ft.commit(); } public void showHelp() { FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.replace(R.id.container, new HelpFragment()); ft.commit(); } 

Creo un nuevo Fragmento y reemplazo el antiguo. Aquellos que se quitan de la pantalla get onDestroy llamado, pero la memoria consumida por los mapas de bits que carga en la pantalla no se quita, por lo que la aplicación se bloquea después de algún intercambio entre los fragmentos.

También intenté quitar referencias en onDestroy

 @Override public void onDestroyView() { destroy(); super.onDestroyView(); adapter.clear(); adapter.clearObservers(); adapter.notifyDataSetChanged(); view.setAdapter(new ArrayAdapter<Journal>(getActivity(), 0)); adapter = null; view = null; } 

Pero la memoria sigue creciendo.

¿Alguien sabe alguna solución? Tal vez reutilizar fragmentos? Efectivamente destruirlo? Estoy escuchando.

He olvidado que stackoverflow cuestión que originalmente sacó este código de, pero un método que parece funcionar bien es anular onAttachFragment de la FragmentActivity y, a continuación, almacenar un WeakReference a cada fragmento pasado WeakReference Entonces, en lugar de utilizar el método de sustitución de un FragmentTransaction , Usted recicla todos los fragmentos (según sea relevante para el caso).

He aquí un ejemplo de miembros y métodos adicionales en una FragmentActivity que crea un fragmento por defecto en onCreate y responde a los cambios a través de onNewIntent :

 private List<WeakReference<Fragment>> mFragments = new ArrayList<WeakReference<Fragment>>(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.add(R.id.fragment_container, MyFragment.newInstance("default")); ft.commit(); } @Override protected void onNewIntent(Intent intent) { setIntent(intent); String section = intent.getStringExtra("section"); recycleFragments(); FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.add(R.id.fragment_container, MyFragment.newInstance(section)); ft.commit(); } @Override public void onAttachFragment(Fragment fragment) { mFragments.add(new WeakReference<Fragment>(fragment)); } private void recycleFragments() { FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); for (WeakReference<Fragment> ref : mFragments) { Fragment fragment = ref.get(); if (fragment != null) { ft.remove(fragment); } } ft.commit(); } 

Ahora si usted monitorea el montón, usted debe notar que no está volando de tamaño. Esta solución suele entrar en juego cuando hay fragmentos anidados que contienen bitmaps que por alguna razón no parecen recuperarse correctamente. Me encantaría una solución más elegante pero esta funciona.

  • ¿Hay de todos modos una aplicación puede utilizar más de 16mb en la memoria?
  • Android: obtiene la asignación de memoria USS de forma programática
  • Android: pre y post-HONEYCOMB montón de uso debido a los mapas de bits?
  • Android - Cómo obtener el uso de memoria de mi dispositivo Android
  • Fuera de la memoria
  • Obtenga memoria de proceso libre en android
  • ¿Cómo analizar el comportamiento de Dalvik GC?
  • Cómo borrar la memoria inactiva en Android mediante programación?
  • Tamaño máximo de montón nativo en Android?
  • Uso de la memoria que sube en la aplicación PhoneGap
  • OutOfMemoryException al pasar la imagen de la cámara a OpenCV
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.