youtubers tesis sobre sirve resumida que para investigaciones investigacion historia caracteristicas android memory-leaks android-fragments

android - tesis - Fragmentos retenidos con UI y pérdidas de memoria



tesis sobre youtube pdf (5)

El "setRetainInstance" se usa para mantener el estado del fragmento cuando se recrea la actividad. De acuerdo con la documentación oficial: si usamos "setRetainInstance", no se ejecutarán 2 métodos del ciclo de vida del fragmento (onCreate, onDestroy). Sin embargo, las vistas contenidas en el fragmento se recrearán, y eso se debe a que el ciclo de vida se ejecutará desde "onCreateView". En estos casos, si hemos guardado algunos datos en "onSaveInstanceState", deberíamos solicitarlo en "onActivityCreated" en lugar de en "onCreate".

Información oficial: https://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)

Más información: https://inthecheesefactory.com/blog/fragment-state-saving-best-practices/en

He leído que la configuración .setOnRetainInstance(true) en fragmentos que presentan UI puede provocar pérdidas de memoria.

¿Podría alguien explicar por qué y cómo sucedería esto? No encontré una explicación detallada en ninguna parte.


En un Fragment con UI, a menudo guarda algunas View como estado de la instancia para acelerar el acceso. Por ejemplo, un enlace a su EditText para que no tenga que encontrar findViewById todo el tiempo.

El problema es que una View mantiene una referencia al contexto de la Activity . Ahora, si conserva una View , también conserva una referencia a ese contexto.

Eso no es problema si el contexto sigue siendo válido, pero el caso típico de retención es reiniciar la Actividad. Muy a menudo para una rotación de pantalla, por ejemplo. La recreación de actividades creará un nuevo contexto y los contextos antiguos están destinados a ser recolectados. Pero no se puede recolectar basura ahora, ya que su Fragment todavía tiene una referencia al anterior.

El siguiente ejemplo muestra cómo no hacerlo

public class LeakyFragment extends Fragment { private View mLeak; // retained @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mLeak = inflater.inflate(R.layout.whatever, container, false); return mLeak; } @Override public void onDestroyView() { super.onDestroyView(); // not cleaning up. } }

Para deshacerse de ese problema, debe borrar todas las referencias a su UI en onDestroyView . Una vez que se reutilice la instancia de Fragment se le pedirá que cree una nueva IU en onCreateView . Tampoco tiene sentido mantener la IU después de onDestroyView . La Ui no va a ser utilizada.

La solución en este ejemplo solo está cambiando en onDestroyView para

@Override public void onDestroyView() { super.onDestroyView(); mLeak = null; // now cleaning up! }

Y además de mantener referencias a View s, obviamente no debe mantener referencias a la Activity (por ejemplo, desde onAttach - clean on on onDetach ) o cualquier Context (a menos que sea el contexto de la Application ).


Tenga cuidado al conservar ciertos objetos que están acoplados a la Actividad.

Precaución: aunque puede devolver cualquier objeto, nunca debe pasar un objeto vinculado a la Actividad, como un Drawable , un Adapter , una View o cualquier otro objeto asociado a un Context. Si lo hace, perderá todas las vistas y recursos de la instancia de actividad original. (La fuga de recursos significa que la aplicación los retiene y no se pueden recolectar basura, por lo que se puede perder mucha memoria).

http://developer.android.com/guide/topics/resources/runtime-changes.html#RetainingAnObject


puede reemplazar onDestroy() e invocar el recolector de elementos no utilizados.

@Override public void onDestroy() { super.onDestroy(); System.gc(); System.gc(); }


setRetainInstance(true) se usa para retener instancias de Fragmentos dinámicos durante una recreación de Actividad, como una rotación de pantalla u otros cambios de configuración. Esto no significa que el Fragmento será retenido para siempre por el sistema.

Cuando una Actividad finaliza por otros motivos, como que el usuario finalice la Actividad (es decir, que presione hacia atrás), el Fragmento debe ser elegible para la recolección de basura.