0

I've a problem with my project. When the user push a button, I generate a new images gallery (not with Gallery class because is deprecated) with a Fragment. When i go to another part of the application, when the user push this button again muy app generate a new images gallery to the right to the previous gallery.

When this button is pressed 3 or 4 times, the app crack because requiere a lot of memory.

My ask is: How can I delete the previous gallery (Fragment) when i press the button the 2 or 3 or 4... time?

I try to do with onPause (call super.onDestroy(), this.onDetach(), ((Object) layoutDinamicoHorizontal).destroyItem() ... on onPause).

My Fragment has a two LinearLayout, one vertical (vertical), and one horizontal(layoutDinamicoHorizontal) and the code is in onActivityCreated:

XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layoutContenedor"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="top|center_horizontal"
    android:gravity="top|center_horizontal"
    android:orientation="vertical">

    <HorizontalScrollView
        android:id="@+id/ScrollHorizontal"
    android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scrollbars="none">

       <LinearLayout
            android:id="@+id/linearLayoutHorizontal"
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

       </LinearLayout>

   </HorizontalScrollView>

</LinearLayout>

Java:

public class FragmentRecommendedWall extends FragmentBase implements Observer {

    private static final String PRUEBA_GALERIA = "pruebaGaleria";
    private static FragmentRecommendedWall mInstance = null;
    JSONArray jsonArrayData;
    private int anchoBitmap;

   public static FragmentRecommendedWall getInstance() {
        return mInstance;
    }

    private static final int CARD_SLOTS = 30;

    private LinearLayout layoutDinamicoHorizontal;
    private LinearLayout layoutGlobal;
    private HorizontalScrollView scrollView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        if (mView == null) {
            mView = inflater.inflate(R.layout.fragmentrecommendedwall,
                    container, 
                    false);
        }

        mView.setAlpha(0.0f);

        return mView;
    }

        @Override
        public void onViewCreated(View view, Bundle savedInstanceState) {

            mInstance = this;
            setUpModels();
        }

        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);

            if(jsonArrayData!=null){
            final Resources res = getResources();

            // Capturamos el layout horizontal en una variable de tipo LinearLayout
            layoutDinamicoHorizontal = (LinearLayout) getView().findViewById(R.id.linearLayoutHorizontal);
            layoutGlobal = (LinearLayout) getView().findViewById(R.id.layoutContenedor);
            scrollView = (HorizontalScrollView) getView().findViewById(R.id.ScrollHorizontal);

            // Creamos un objeto de tipo ImageView
            ImageView imageViewDinamicoArriba;
            ImageView imageViewDinamicoAbajo;

            int j = 0;
            for (int i = 0; i < 30; i += 2){

                // Creamos un nuevo objeto de la clase ImageView
                imageViewDinamicoArriba = new ImageView(getActivity());
                imageViewDinamicoAbajo = new ImageView(getActivity());

                imageViewDinamicoArriba.setId(i);
                        imageViewDinamicoAbajo.setId(i+1);

                // Calculamos los sp con los pixeles
                int paddingLeft = (int) (15 * getResources().getDisplayMetrics().density);
                int paddingRight = (int) (15 * getResources().getDisplayMetrics().density);
                int paddingTop = (int) (15 * getResources().getDisplayMetrics().density);
                int paddingBotom = (int) (15 * getResources().getDisplayMetrics().density);

                // Aplicamos un padding a los objetos de la clase ImageView
                imageViewDinamicoArriba.setPadding(paddingLeft, paddingRight, paddingTop, paddingBotom);
                imageViewDinamicoAbajo.setPadding(paddingLeft, paddingRight, paddingTop, paddingBotom);

                Bitmap imagenArriba = null;
                Bitmap imagenAbajo = null;

                // Asignamos a los objetos Bitmap la imagen. La cogemos del método getTexture
                try {
                    imagenArriba = getTexture(i);
                    imagenAbajo = getTexture(i+1);

                } catch (IOException e) {
                    e.printStackTrace();
                }

                // Repetimos las imágenes para que haya 30
                if(j < 3){
                    if(imagenArriba == null && imagenAbajo == null){
                    i = 0;
                    j++;
                    }
                }

                // Se los pasamos a los objetos
                imageViewDinamicoArriba.setImageBitmap(imagenArriba);
                try {
                    imageViewDinamicoArriba.setTag((String) jsonArrayData.getJSONObject(i).get("contentDescription"));

                } catch (JSONException e) {
                    e.printStackTrace();
                }

                imageViewDinamicoAbajo.setImageBitmap(imagenAbajo);
                try {
                    imageViewDinamicoAbajo.setTag((String) jsonArrayData.getJSONObject(i + 1).get("contentDescription"));
                } catch (JSONException e) {
                    e.printStackTrace();
                }

                // Hay que duplicar el setOnlickListener. Uno para la imagen de arriba y otro
                // para la imagen de abajo
               imageViewDinamicoArriba.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Log.i("galeria", "Dentro del onClick Imagen: " + v.getTag());
                    }
                });

                imageViewDinamicoAbajo.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Log.i("galeria", "Dentro del onClick Imagen: " + v.getTag());
                    }
                });

            LinearLayout vertical = new LinearLayout(getActivity());
                vertical.setOrientation(LinearLayout.VERTICAL);

                // Añadimos las vistas al objeto vertical
                vertical.addView(imageViewDinamicoArriba);  
                vertical.addView(imageViewDinamicoAbajo);

                layoutDinamicoHorizontal.addView(vertical);

                }// Fin del for

            scrollView.setScrollX(450);

            }// End of if(jsonArrayData!=null)

        } // End of onActivityCreated

        public static void destroy() {
            mInstance = null;
        }

} // End of Class FragmentRecommendedWall

Thanks a lot

krayan
  • 1
  • 2
  • Instead of deleting and recreating the `Fragment`, why don't you just reuse it? – Andrew Schuster Dec 09 '13 at 14:28
  • Because the Fragment is not always the same. Depends of another class i have to draw one group or other group of bitmaps. – krayan Dec 09 '13 at 15:18
  • The **contents** of the `Fragment` aren't always the same. The `Fragment` is. When you create multiple `Fragments`, the garbage collector can't get to it fast enough, and seeing as you're working with `Bitmaps`, memory goes quickly. – Andrew Schuster Dec 09 '13 at 15:29
  • Do you know which is the right way to work with bitmaps? Thanks – krayan Dec 09 '13 at 16:24
  • I don't know the whole context of your app, but maybe look into [Lazy Loading](http://stackoverflow.com/questions/541966/how-do-i-do-a-lazy-load-of-images-in-listview) or you could see what the [Developer documentation](http://developer.android.com/training/displaying-bitmaps/index.html) has to say. – Andrew Schuster Dec 09 '13 at 16:31

0 Answers0