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:
- Bitmap recycle () en java Android
- Tamaño de una aplicación Android de Hello World
- DeadObjectException en la aplicación android
- ¿Cómo descubro el uso de memoria de mi aplicación en Android?
- Android SparseArray con la clave de cadena?
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.
- Supervisar la memoria ocupada por mi aplicación en Android
- Android java, obtener más uso de memoria permitido
- Android: ¿herramientas para encontrar fugas de memoria?
- Máxima memoria nativa que se puede asignar a una aplicación para Android
- Fuga de memoria de WebView en la aplicación de Android
- Límite de tamaño de Android montón, todavía tenemos necesidad de diseñar aplicaciones con un límite de 16 MB en mente?
- android Baja memoria: no más proceso de fondo ?? Necesitas ayuda
- ¿Cómo gestiona la memoria Android?
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.