java.lang.OutOfMemoryError: bitmap size exceeds VM budget - Android

前端 未结 13 2004
醉话见心
醉话见心 2020-11-22 01:32

I developed an application that uses lots of images on Android.

The app runs once, fills the information on the screen (Layouts, Listviews,

13条回答
  •  一整个雨季
    2020-11-22 02:09

    One of the most common errors that I found developing Android Apps is the “java.lang.OutOfMemoryError: Bitmap Size Exceeds VM Budget” error. I found this error frequently on activities using lots of bitmaps after changing orientation: the Activity is destroyed, created again and the layouts are “inflated” from the XML consuming the VM memory available for bitmaps.

    Bitmaps on the previous activity layout are not properly de-allocated by the garbage collector because they have crossed references to their activity. After many experiments I found a quite good solution for this problem.

    First, set the “id” attribute on the parent view of your XML layout:

        
        
         ...
    

    Then, on the onDestroy() method of your Activity, call the unbindDrawables() method passing a reference to the parent View and then do a System.gc().

        @Override
        protected void onDestroy() {
        super.onDestroy();
    
        unbindDrawables(findViewById(R.id.RootView));
        System.gc();
        }
    
        private void unbindDrawables(View view) {
            if (view.getBackground() != null) {
            view.getBackground().setCallback(null);
            }
            if (view instanceof ViewGroup) {
                for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
                unbindDrawables(((ViewGroup) view).getChildAt(i));
                }
            ((ViewGroup) view).removeAllViews();
            }
        }
    

    This unbindDrawables() method explores the view tree recursively and:

    1. Removes callbacks on all the background drawables
    2. Removes children on every viewgroup

提交回复
热议问题