PDA

Ver la Versión Completa : [ CONSULTA ] fragments y ram


Siameze
02/05/14, 19:57:57
Buenas! Estoy teniendo un problema cuando intento remplazar un fragment de un contenedor.
Los traslados se hacen todos bien, pero al parecer no se libera la ram que ocupan los views, a pesar de que los limpio todos.

Cuanto apretó back tampoco se limpia nada del fragment, por lo tanto, con dos fragment yendo atrás y adelanto llego a ocupar 70mb de ram rapidísimo, cuando cada fragment no supera los 12mb.

el metodo que uso para pasar de un fragment a otro es este:

FragmentManager fragmentManager = getSupportFragmentManager();

for(int i = 0; i < fragmentManager.getBackStackEntryCount()-1; ++i) {
fragmentManager.popBackStack();
}

final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_left)
.replace(R.id.container, fr,tag)
.addToBackStack(null)
.commit();tambien tengo esto en el back, para evitar cerrar la app. no se si tendra alguna relacion:

@Override
public void onBackPressed() {

if (getSupportFragmentManager().getBackStackEntryCoun t() > 1) {
super.onBackPressed();
}else if(getSupportFragmentManager().getBackStackEntryCo unt() == 1){
mNavigationDrawerFragment.AbrirNavigationDrawer();
}
// finish();

}
Asi es como trato a todos los fragments:

private ArrayList<ElementoLista> Aelem= new ArrayList<ElementoLista>();
private String mTabla;
private int modoMenu;


@Override
public void onActivityCreated(Bundle savedInstanceState) {

super.onActivityCreated(savedInstanceState);

//Interface para comunicarse con el activity principal.
final Communicator comunicador = (Communicator) getActivity();
//Inicializo el gridview.
final GridView lv = (GridView) getView().findViewById(R.id.lvtragos);

lv.setOnItemClickListener(new OnItemClickListener(){

@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
comunicador.clickEnListaElementos(getTabla(),Aelem .get(position).getId(),(byte) 3);

};
});

final AdaptadorElemLista adaptador = new AdaptadorElemLista(getView().getContext());
lv.setAdapter(adaptador);

setHasOptionsMenu(true);
}

@Override
public void onDestroyView() {
getView().destroyDrawingCache();
super.onDestroyView();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_3, container,false);
}si alguien puede ayudarme a solucionar esto, le voy a estar realmente agradecido =)

Mil gracias por leer!

kriogeN
02/05/14, 21:23:08
No te preocupes que si el sistema necesita RAM lo primero que te liberará serán los Fragment que no están añadidos a una Activity.

El Fragment sigue existiendo pero no está añadido a ninguna Activity, técnicamente podrías volver a añadirlo a la Activity (a la misma, nunca a otra distinta).

Más bien deberías de preocuparte de lo contrario, de que si por necesitar RAM quiera liberarte algún Fragment que está en uso mientras la Activity está en segundo plano. Donde entra el onSaveInstanceState del Fragment y de la propia Activity, y tener que almacenar y luego recuperar la información que necesitas, incluido al propio Fragment.