Removes the reference to the activity from every view in a view hierarchy (listeners, images etc.). - Android User Interface

Android examples for User Interface:View Slide

Description

Removes the reference to the activity from every view in a view hierarchy (listeners, images etc.).

Demo Code


//package com.book2s;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.widget.ImageView;

public class Main {
    /**/*ww  w. ja v  a2s  .  c  o  m*/
     * Removes the reference to the activity from every view in a view hierarchy
     * (listeners, images etc.). This method should be called in the onDestroy() method
     * of each activity.
     * This code may stinks, but better than worse - suspiciously, Android framework
     * does not free resources immediately which are consumed by Views and this leads to
     * OutOfMemoryError sometimes although there are no user mistakes.
     *
     * @param view View to free from memory
     * @see http://code.google.com/p/android/issues/detail?id=8488
     */
    public static void unbindReferences(View view) {
        try {
            if (view != null) {
                unbindViewReferences(view);
                if (view instanceof ViewGroup) {
                    unbindViewGroupReferences((ViewGroup) view);
                }
            }
        } catch (Exception ignore) {
            /* whatever exception is thrown just ignore it because a crash is
             * always worse than this method not doing what it's supposed to do
             */
        }
    }

    /**
     * Removes the reference to the activity from every view in a view hierarchy
     * (listeners, images etc.). This method should be called in the onDestroy() method
     * of each activity.
     * This code may stinks, but better than worse - suspiciously, Android framework
     * does not free resources immediately which are consumed by Views and this leads to
     * OutOfMemoryError sometimes although there are no user mistakes.
     *
     * @param view View to free from memory
     * @see http://code.google.com/p/android/issues/detail?id=8488
     */
    public static void unbindReferences(Activity activity, int viewID) {
        try {
            View view = activity.findViewById(viewID);
            if (view != null) {
                unbindViewReferences(view);
                if (view instanceof ViewGroup) {
                    unbindViewGroupReferences((ViewGroup) view);
                }
            }
        } catch (Exception ignore) {
            /* whatever exception is thrown just ignore it because a crash is
             * always worse than this method not doing what it's supposed to do.
             */
        }
    }

    @SuppressWarnings("deprecation")
    private static void unbindViewReferences(View view) {
        // Set everything to null (API Level 8)
        try {
            view.setOnClickListener(null);
        } catch (Exception ignore) {
        }

        try {
            view.setOnCreateContextMenuListener(null);
        } catch (Exception ignore) {
        }

        try {
            view.setOnFocusChangeListener(null);
        } catch (Exception ignore) {
        }

        try {
            view.setOnKeyListener(null);
        } catch (Exception ignore) {
        }

        try {
            view.setOnLongClickListener(null);
        } catch (Exception ignore) {
        }

        try {
            view.setOnClickListener(null);
        } catch (Exception ignore) {
        }

        try {
            view.setTouchDelegate(null);
        } catch (Exception ignore) {
        }

        Drawable d = view.getBackground();
        if (d != null) {
            try {
                d.setCallback(null);
            } catch (Exception ignore) {
            }
        }

        if (view instanceof ImageView) {
            ImageView imageView = (ImageView) view;
            d = imageView.getDrawable();
            if (d != null) {
                d.setCallback(null);
            }

            if (d instanceof BitmapDrawable) {
                Bitmap bm = ((BitmapDrawable) d).getBitmap();
                bm.recycle();
            }

            imageView.setImageDrawable(null);
        } else if (view instanceof WebView) {
            ((WebView) view).destroyDrawingCache();
            ((WebView) view).destroy();
        }

        try {
            view.setBackgroundDrawable(null);
        } catch (Exception ignore) {
        }

        try {
            view.setAnimation(null);
        } catch (Exception ignore) {
        }

        try {
            view.setContentDescription(null);
        } catch (Exception ignore) {
        }

        try {
            view.setTag(null);
        } catch (Exception ignore) {
        }
    }

    private static void unbindViewGroupReferences(ViewGroup viewGroup) {
        int nrOfChildren = viewGroup.getChildCount();
        for (int i = 0; i < nrOfChildren; i++) {
            View view = viewGroup.getChildAt(i);
            unbindViewReferences(view);
            if (view instanceof ViewGroup) {
                unbindViewGroupReferences((ViewGroup) view);
            }
        }

        try {
            viewGroup.removeAllViews();
        } catch (Exception ignore) {
            // AdapterViews, ListViews and potentially other ViewGroups don't support the removeAllViews operation
        }
    }
}

Related Tutorials