Thursday, February 16, 2012

Drawables resources management in android


I have one question. I made quick search on the site, but don't found answer. We develop application that running android 2.2 and higher. For views customization we use many drawables, that used in such way:




<LinearLayout ...
android:background="@drawable/some_drawable"/>



We use maps too and manipulate with many data in the memory, and our app got a heavy. On top devices, it work's great,but on other we got OutOfMemory exception after some minutes of using our application. It's look as we have memory leaks. I'm trying reduce the memory usage of our app. question, do we need manualy cleaning resources on destroing our activities: removes drawables for view, or system made it for us?

2 comments:

  1. I have encountered this issue in my app as well. OutOfMemoryError would be thrown if a lot of bitmaps were used in an activity, with scaling and/or other bitmap manipulation. What I have done is added the following code to my activity, which seems to make the problem appearing less often (it didn't solve it for good) and the app now runs with no errors on a reasonably low-end handset.

    @Override
    protected void onDestroy()
    {
    super.onDestroy();
    // explicitly release media player
    if(viewObjectInfo != null)
    viewObjectInfo.releaseMediaPlayer();
    //explicitly release all drawables and call GC
    unbindDrawables(findViewById(R.id.main));
    System.gc();
    }

    /**
    * Unbinds all drawables in a given view (and its child tree).
    *
    * @param findViewById Root view of the tree to unbind
    */
    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));
    }
    try
    {
    ((ViewGroup) view).removeAllViews();
    }
    catch(UnsupportedOperationException ignore)
    {
    //if can't remove all view (e.g. adapter view) - no problem
    }
    }
    }

    ReplyDelete
  2. If you are dealing with a lot of images, the best you can do is have a look at this video from Google: http://www.youtube.com/watch?v=_CruQY55HOk

    Bitmaps are a complex world in Android. Trut me and take your time to understand it.

    ReplyDelete