Fragmentos de memoria de Android Fragment

Estoy haciendo una pequeña aplicación en mi sparetime y estoy usando muchos fragmentos. Soy bastante nuevo a los fragmentos sin embargo he utilizado muchos recursos para utilizar el apropiadamente … o así que pensé. Estoy recibiendo fugas de memoria como mi montón sigue creciendo a medida que cambio de fragmento a fragmento. Tenía mi aplicación implementada con Actividades anteriormente y había reducido significativamente las pérdidas de memoria. Sin embargo, ahora que me estoy uniendo al mundo de los fragmentos, me siento como si estuviera empezando en el primer lugar cuando se trata de la memoria.

MainActivity.java

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); // Setting the content view of the Activity setContentView(R.layout.main); // Setting up the actionbar. ActionBar actionbar = getActionBar(); actionbar.setSubtitle(""); actionbar.setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE | ActionBar.DISPLAY_SHOW_CUSTOM); actionbar.setTitle(""); actionbar = null; MainMenuFragment frag = new MainMenuFragment(); getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, frag).commit(); } 

Esta MainActivity también configura la ActionBar.

MainMenuFragment.java

 public class MainMenuFragment extends Fragment implements OnClickListener, LoaderCallbacks<Cursor> { private static final String TAG = "MainMenuFragment"; SharedPreferences.Editor prefsEditor; SharedPreferences prefs; Bitmap[] picss = null; static int width; private static int FRIENDS = 0; private static int PEOPLE = 1; private static int MAP = 2; private static int CAMERA = 3; private static int TOP_TILE = 4; LinearLayout topTile = null; LinearLayout mainLayout; private int NUM_OF_BUTTONS = 4; ImageButton[] buttonList = null; Bitmap background; protected Activity activity; protected String placeId = null; protected ViewGroup container; protected View view; public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); activity = getActivity(); view = getView(); setupObjects(view); setupLayoutsAndImages(view); // Populate the UI by initiating the loader to retrieve the // details of the venue from the underlying Place Content Provider. if (placeId != null) getLoaderManager().initLoader(0, null, this); } public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.main_screen , container, false); this.container = container; return view; } public void onDestroyView() { super.onDestroyView(); Log.d(TAG, "onDestroyView()"); buttonList[FRIENDS].setImageBitmap(null); buttonList[PEOPLE].setImageBitmap(null); buttonList[MAP].setImageBitmap(null); buttonList[CAMERA].setImageBitmap(null); topTile.setBackground(null); // Removes all the onClickListeners buttonList[FRIENDS].setOnClickListener(null); buttonList[PEOPLE].setOnClickListener(null); buttonList[MAP].setOnClickListener(null); buttonList[CAMERA].setOnClickListener(null); topTile.setOnClickListener(null); // Sets buttonList and the topTile to null buttonList = null; topTile = null; // Recycles the bitmaps and sets picss to null if (picss != null) { picss[FRIENDS].recycle(); picss[PEOPLE].recycle(); picss[MAP].recycle(); picss[CAMERA].recycle(); picss = null; } mainLayout.setBackground(null); background.recycle(); unbindDrawables(view); view = null; activity = null; System.gc(); } private void unbindDrawables(View view) { if (view.getBackground() != null) { view.getBackground().setCallback(null); } if (view instanceof ViewGroup && !(view instanceof AdapterView)) { for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { unbindDrawables(((ViewGroup) view).getChildAt(i)); } ((ViewGroup) view).removeAllViews(); } } public void onClick(View v) { Log.d(TAG, "Got within here."); switch (v.getId()) { case R.id.b_friendButton: FragmentTransaction trans = getActivity().getSupportFragmentManager().beginTransaction(); trans.replace(R.id.fragment_container, new FriendsListFrag()); trans.addToBackStack(null); trans.commit(); break; case R.id.b_peopleButton: break; case R.id.b_mapButton: break; case R.id.b_CameraButton: break; case R.id.ll_Dynamic_Tile: break; } } private void setupObjects(View view) { Log.d(TAG, "Attempting to setupObjects."); mainLayout = (LinearLayout) view.findViewById(R.id.MainActivity_Main_Layout); topTile = (LinearLayout) view.findViewById(R.id.ll_Dynamic_Tile); buttonList = new ImageButton[NUM_OF_BUTTONS]; buttonList[FRIENDS] = (ImageButton) view.findViewById(R.id.b_friendButton); buttonList[PEOPLE] = (ImageButton) view.findViewById(R.id.b_peopleButton); buttonList[MAP] = (ImageButton) view.findViewById(R.id.b_mapButton); buttonList[CAMERA] = (ImageButton) view.findViewById(R.id.b_CameraButton); picss = new Bitmap[5]; buttonList[FRIENDS].setOnClickListener(this); buttonList[PEOPLE].setOnClickListener(this); buttonList[MAP].setOnClickListener(this); buttonList[CAMERA].setOnClickListener(this); int width = getActivity().getWindowManager().getDefaultDisplay().getWidth(); int height = getActivity().getWindowManager().getDefaultDisplay().getHeight(); background = GetImage.decodeSampledBitmapFromResource(getResources(), R.drawable.background2, width, height); System.out.println(mainLayout == null); mainLayout.setBackground(new BitmapDrawable(getResources(), background)); } private void setupLayoutsAndImages(View view) { Log.d(TAG, "Attempting to setupLayoutsAndImages."); System.out.println("Width: " + width); final ImageButton myButton = (ImageButton) getView().findViewById(R.id.b_friendButton); getView().getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { public void onGlobalLayout() { System.out.println("Fragwidth: " + getView().getWidth()); System.out.println("FragHeight: " + getView().getHeight()); System.out.println("Button: " + myButton.getWidth()); width = myButton.getWidth(); System.out.println("Width: " + width); getView().getViewTreeObserver().removeGlobalOnLayoutListener(this); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( width, width, 1.0f); int marg = (int) getResources().getDimension( R.dimen.main_buttonpadding); params.setMargins(marg, marg, marg, marg); // Setting the params for the buttons. buttonList[FRIENDS].setLayoutParams(params); buttonList[PEOPLE].setLayoutParams(params); buttonList[MAP].setLayoutParams(params); buttonList[CAMERA].setLayoutParams(params); picss[FRIENDS] = GetImage.decodeSampledBitmapFromResource( getResources(), R.drawable.tilefriendsmall, width, width); picss[PEOPLE] = GetImage.decodeSampledBitmapFromResource( getResources(), R.drawable.tilepeoplesmall, width, width); picss[MAP] = GetImage.decodeSampledBitmapFromResource( getResources(), R.drawable.tilemapsmall, width, width); picss[CAMERA] = GetImage.decodeSampledBitmapFromResource( getResources(), R.drawable.tilecamerasmall, width, width); picss[TOP_TILE] = GetImage.decodeSampledBitmapFromResource( getResources(), R.drawable.tilefriendlong, width, width); // Setting up the background for the buttons. buttonList[FRIENDS].setImageBitmap(picss[FRIENDS]); buttonList[FRIENDS].setAlpha(0.6f); buttonList[PEOPLE].setImageBitmap(picss[PEOPLE]); buttonList[PEOPLE].setAlpha(0.6f); buttonList[MAP].setImageBitmap(picss[MAP]); buttonList[MAP].setAlpha(0.6f); buttonList[CAMERA].setImageBitmap(picss[CAMERA]); buttonList[CAMERA].setAlpha(0.6f); LinearLayout.LayoutParams topParams = new LinearLayout.LayoutParams( topTile.getWidth(), width); topParams.setMargins(marg, marg, marg, marg); topTile.setLayoutParams(topParams); topTile.setBackground(new BitmapDrawable(getResources(), picss[TOP_TILE])); topTile.setAlpha(0.6f); } }); } 

Teniendo en cuenta el código anterior, cuando cambie a FriendsListFrag () conservo la memoria anterior que se asignó para MainMenuFragment. He intentado utilizar el analizador de la memoria pero he tenido poca suerte con él.

Sigues creando (y adjuntando) una nueva instancia de tu fragmento.

Cambia esto:

  MainMenuFragment frag = new MainMenuFragment(); getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, frag).commit(); 

Para algo como:

 Fragment fragment = getSupportFragmentManager(). findFragmentById(R.id.fragment_container); if ( fragment == null ) { fragment = new MainMenuFragment(); getSupportFragmentManager() .beginTransaction() .add(R.id.fragment_container, fragment, "SOME_TAG_IF_YOU_WANT_TO_REFERENCE_YOUR_FRAGMENT_LATER") .commit(); } 

El FragmentManager mantiene las referencias de los Fragmentos y maneja eso por sí mismo. Puede quitarlos si lo desea (antes de llamar a la llamada a onSaveInstance ()) utilizando el método .detach () en el FragmentManager.

Podrías hacerlo:

 Fragment f = getSupportFragmentManager().findFragmentByTag("SOME_TAG_IF_YOU_WANT_TO_REFERENCE_YOUR_FRAGMENT_LATER"); if ( f != null ) { getSupportFragmentManager().detach(f); } 

Nota: Esto es todo pseudo-código y no lo probé, podría haber errores ortográficos, pero tienes la idea

Es probablemente su oyente OnGlobalLayout. Tengo el mismo problema que de alguna manera se pierde el fragmento a pesar de que no se registró en onDestroy y ponerlo en nulo.

Pruebe el fragmento sin la implementación del oyente y compruebe si todavía se filtra.

Sin embargo, desafortunadamente no pude encontrar una solución o alternativa para ello todavía …

  • Uso de finales estáticas en la actividad de Android
  • Android: ¿Dónde está la herramienta Monitor de memoria?
  • "Advertencia: no coloque las clases de contexto de Android en campos estáticos; Esto es una fuga de memoria (y también rompe el funcionamiento inmediato) "
  • ¿Es esta Runnable a salvo de fugas de memoria?
  • No se puede asignar suficiente memoria en JNI
  • Análisis de memoria en Android: dominator_tree no muestra todas las instancias de algunos objetos
  • Descargar Doc / PDF desde Internet y guardar en la memoria interna
  • Android: liberación de la memoria asignada AnimationDrawable está utilizando hasta
  • Pérdida de memoria causada por el método initialize de YouTubePlayer.Provider
  • Problemas de memoria - fragmentos
  • ¿Cómo averiguar el uso de memoria de la aplicación en ejecución actual en android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.