Skip to main content

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?


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

Post a Comment

Popular posts from this blog

Why is this Javascript much *slower* than its jQuery equivalent?

I have a HTML list of about 500 items and a "filter" box above it. I started by using jQuery to filter the list when I typed a letter (timing code added later): $('#filter').keyup( function() { var jqStart = (new Date).getTime(); var search = $(this).val().toLowerCase(); var $list = $('ul.ablist > li'); $list.each( function() { if ( $(this).text().toLowerCase().indexOf(search) === -1 ) $(this).hide(); else $(this).show(); } ); console.log('Time: ' + ((new Date).getTime() - jqStart)); } ); However, there was a couple of seconds delay after typing each letter (particularly the first letter). So I thought it may be slightly quicker if I used plain Javascript (I read recently that jQuery's each function is particularly slow). Here's my JS equivalent: document.getElementById('filter').addEventListener( 'keyup', function () { var jsStart = (new Date).getTime()...

Is it possible to have IF statement in an Echo statement in PHP

Thanks in advance. I did look at the other questions/answers that were similar and didn't find exactly what I was looking for. I'm trying to do this, am I on the right path? echo " <div id='tabs-".$match."'> <textarea id='".$match."' name='".$match."'>". if ($COLUMN_NAME === $match) { echo $FIELD_WITH_COLUMN_NAME; } else { } ."</textarea> <script type='text/javascript'> CKEDITOR.replace( '".$match."' ); </script> </div>"; I am getting the following error message in the browser: Parse error: syntax error, unexpected T_IF Please let me know if this is the right way to go about nesting an IF statement inside an echo. Thank you.