Es el comportamiento similar a la forma en que las Actividades de trabajo? Por ejemplo, con Actividades que funciona de la siguiente manera:

La actividad de Un comienza Actividad B, mientras que B está en la pantalla, el sistema es capaz de eliminar Un de la memoria si es necesario por el sistema. Al pulsar de nuevo, UN será recreado en la memoria como si nunca la izquierda en el primer lugar.

He buscado una explicación clara de lo que sucede memoria sabio con Fragmentos y no he encontrado nada. Funciona de la misma manera? Por ejemplo:

Actividad C ha Fragmento F en su diseño. Entonces, en algún punto de F es reemplazado por Fragmento G, pero F se mantiene en su parte de atrás de la pila.

Se F permanecer en la memoria hasta que el C es asesinado, o puede ser removido por el sistema según sea necesario?

Realmente lo que estoy preguntando es si estoy o no correr el riesgo de quedarse sin memoria si tengo una copia de la pila de Fragmentos complicados en una sola Actividad?

  • Tenga en cuenta que su primera suposición es incorrecta: la Actividad «A» nunca será eliminado de la memoria. Consulte commonsware.com/blog/2011/10/03/…
  • increíble… me siento como que he estado viviendo una mentira… yo casi no lo creo…
  • Sistema de no matar a una sola actividad o fragmento. Sólo se puede matar a todo el proceso de recuperar la memoria cuando se ejecuta bajo.

4 Comentarios

  1. 101

    Echar un vistazo a esto: BackStackRecord.Op.fragmento

    Que es cómo se almacenan los fragmentos en la parte posterior de la pila. Nota el vivir de referencia, ni WeakReference ni SoftReference se utilizan allí.

    Ahora esto: FragmentManagerImpl.mBackStack

    Que es donde el administrador de tiendas de la parte posterior de la pila. Simple ArrayList, también, no los Representantes de la oms o de la cirugía.

    Y finalmente esto: Actividad.mFragments

    Que es la referencia para el fragmento de administrador.

    GC sólo puede recoger los objetos que no tienen ningún vivir referencias (no accesible desde cualquier hilo). Eso significa que, hasta que su Actividad se destruye (y por lo tanto, FragmentManager de referencia se ha ido), GC no será capaz de cobrar alguno de los Fragmentos en la parte posterior de la pila.

    Tenga en cuenta que cuando la Actividad es destruido y conserva el estado (como cuando se gire el dispositivo a modo de paisaje), no conservará real Fragment objetos en la pila, sólo sus estados – Fragmento.FragmentState objetos, es decir, real fragmentos en la parte posterior de la pila se vuelve a crear cada vez que la actividad se re-crea con la retención de estado.

    Espero que esto ayude.

    PS Así que, en resumen: Sí, puede ejecutar fuera de la memoria mediante la adición de Fragments a la espalda de la pila así como añadiendo demasiados puntos de vista a la vista de jerarquía.

    UPD teniendo en cuenta su ejemplo, F permanecerá en la memoria hasta que C es asesinado. Si C es asesinada y luego resucitada con diferente configuración – F será destruido y reencarnado en un objeto diferente también. Así, F‘s de la huella de memoria es de alrededor de hasta C pierde el estado o la parte posterior de la pila está desactivada.

    • Nota, sin embargo, que cuando un fragmento se coloca en la parte posterior de la pila, su onDestroyView() es llamado. Si en ese punto se puede limpiar con cualquiera de las principales asignaciones que se celebra por el fragmento, usted no debería tener problemas de memoria.
    • Sí, sólido punto. Fragmento de objetos todavía tomará una cierta cantidad de mem y, estrictamente hablando, uno todavía puede inundación de memoria con una enorme cantidad de fragmentos, incluso si la limpieza de la lógica está en su lugar, pero definitivamente eres la derecha – si se limpian correctamente, en condiciones reales (es decir, cuando la cantidad de fragmentos es sensato) de vuelta a la pila de fragmentos no debería causar una considerable sobrecarga de memoria.
    • ¿Qué entiende usted por major allocations?
    • Si puedo, lo más probable Dianne significó algo de memoria-pesado y no gestionada por el fragmento de vista de la jerarquía, el ejemplo más notable siendo Bitmaps. Si el fragmento se aferra a un par de tipos primitivos o media-sised Strings — que probablemente ACEPTAR. Pero desechar cualquier cosa que varias instancias de la cual te llevaría sobre el proceso de memoria cap.
    • También es necesario null fragmento de Vista de referencias así? Quiero decir, si el fragmento es destruido (onDestroyView() se llama) y GC quiere recoger la basura, será la vieja del fragmento Vistas se recoge si las referencias a los puntos de vista estancia en el fragmento (pérdida de memoria)? O no importa porque si el fragmento es destruido, a continuación, todos los objetos holt por fragmento (solo por fragmento) pueden ser recogidos por GC?
    • Buena idea. Cuando se ponen a la vuelta de la pila, un Fragment instancia no es destoyed, así onDestroyView() siempre debe null cualquier vista de las referencias que tiene. De lo contrario, se mantendrán los muertos vistas de llegar GCed. También, no backstack conservan fragmentos (ver setRetainInstance(true)) no son destruidos, incluso cuando elActivity se recrea, de manera que, manteniendo la vista de las referencias que usted puede perder toda una Activity. Normalmente esto no sucede, sin embargo, porque en el 99% de los casos ver refs se actualizan en onCreateView() que no se llama en la Actividad de recreación, así que después de que los árbitros punto a nuevos puntos de vista, de todos modos.
    • Gracias por la respuesta. Actualmente estoy luchando con la OOM en mi aplicación. Por simplicidad, tengo 1 actividad (A) y un fragmento (F), que contiene viewpager con 2 otro de los fragmentos (F1 y F2). De la F1, si el usuario hace clic en un botón, luego otro ejemplo de (F) es abierto a partir de la Una y se añaden a un backstack. Entonces, si el usuario hace esto varias veces, luego OOM ocurrirá más pronto o más tarde. Voy a intentar null cada referencia de vista de onDestroy().
    • Bueno, cosas como esta no puede diagnosticarse fácilmente sin necesidad de código. Debemos tomar esto a una sala de chat si desea obtener más ayuda.
    • No, no es necesario, yo sólo era curiosidad. Pero gracias de todos modos! 🙂
    • La mejor respuesta, contratz!
    • Supongo que me falta un punto aquí. FragmentState objeto es el que se mantiene sólo a través de cambios en la configuración, no la real correspondiente fragmento. Pero FragmentState objeto contiene una referencia (mInstance) del fragmento y es fuerte. Así que, ¿cómo GC se las arregla para destruir fragmento sin destruirlo estado del objeto, la cual incluye una referencia al fragmento.

  2. 7

    Lo siento por no ser capaz de proporcionar alguna fuente oficial de información, pero tenía curiosidad para ver qué pasaba y decidí probarlo. Y según mis pruebas, sí, se corre el riesgo de quedarse sin memoria.

    He tenido que añadir una increíble cantidad de Fragmentos (más de cien) en un bucle for para la OutOfMemoryError a suceder, pero sucedió. Y la comprobación de los registros de mi, pude ver que la onCreate() y onCreateView() métodos se han llamado un montón de veces, pero onSaveInstance(), onPause() y onDestroy no llama en absoluto.

    De referencia, esta es la forma en que he añadido los fragmentos de la backstack:

    getSupportFragmentManager().beginTransaction().add(R.id.scene_fragment_container, mSceneFragment).addToBackStack("FOOBAR").commit();

    Y los Fragmentos he añadido eran algo simple: un ImageView, un EditText, un par TextViews, un SeekBar y un ListView.

    Pero a menos que usted está sosteniendo una enorme cantidad de datos en memoria no debería ser un problema.

    Más tarde he intentado añadir a sólo 50 a la backstack, matando a la aplicación y reiniciar. Y como yo esperaba/adivinado, todos los fragmentos fueron restaurados (y la onSaveInstance() y onPause() métodos llamados) así que mi ciclo de vida de la aplicación no era el problema que causó el OutOfMemoryError a fuego.

  3. 4

    De developer.android.com/guide/topics/fundamentals/fragments.html

    Un fragmento debe ser siempre incrustado en una actividad y el fragmento del ciclo de vida está directamente afectado por el anfitrión de la actividad del ciclo de vida. Por ejemplo, cuando la actividad está en pausa, por lo que son todos los fragmentos en ella, y cuando la actividad se destruye, por lo que son todos los fragmentos. Sin embargo, mientras que una actividad se ejecuta (es en la reanudación del ciclo de vida del estado), se puede manipular cada uno de los fragmentos de manera independiente, tales como agregar o quitar. Cuando se realiza un fragmento de la transacción, también se puede añadir a una vuelta de la pila que es administrado por la actividad de cada parte trasera de la pila de entrada en la actividad es un registro de un fragmento de la transacción que se ha producido. La parte posterior de la pila permite al usuario invertir un fragmento de la transacción (navegar hacia atrás), pulsando el botón ATRÁS.

    • Gracias Bill. Sin embargo, que todavía no quiere decir que una manera o de otra, si los Fragmentos en la parte posterior de la pila se conservan en la memoria o se libera cuando se necesita, y eso es lo que estoy pensando…
    • ¿por qué no esta la respuesta a su pregunta? Obviamente están en la memoria, pero en pausa como una actividad regular, que no se limpian hasta que regrese o que su actividad es destruido.
  4. 1

    Sí puede ejecutar fuera de la memoria de la creación de demasiados fragmentos en una sola actividad. Los fragmentos sólo será destruida cuando el contenido de la Actividad es.

Dejar respuesta

Please enter your comment!
Please enter your name here