When you say that it hasn't improved your garbage collection problem,
do you mean that it still GCs 13000 objects every 2 seconds?


On Mon, Apr 13, 2009 at 10:42 PM, DavidG <dgu...@gmail.com> wrote:
>
> Thanks for the feedback.. Now I'm trying to use StringBuilder and
> Formatter, but I just can't get it to stop doing the garbage
> collection. I'm not sure how to go about reusing the Formatter. At
> first, I just tried creating a public static Formatter member variable
> and using it directly:
>
> public Formatter mFormatter = new Formatter();
>  (then later within setViewValue()... )
> mFormatter.format("%.2f",pricef).toString();
>
> Unfortunately the formatter seemed to keep "building" onto itself,
> making each item in the list return a longer and longer string as I
> scrolled.
>
> Then I looked into the Android source code and found an example that I
> tried to mimick. While it gives me the output I expect, it hasn't
> improved my garbage collection problem. I'm just going to post the
> majority of my ViewBinder class, can someone point out where I'm going
> wrong?
>
> <START CODE>
> import java.util.Formatter;
> import android.database.Cursor;
> import android.graphics.Color;
> import android.graphics.Paint;
> import android.view.View;
> import android.widget.ImageView;
> import android.widget.SimpleCursorAdapter;
> import android.widget.TextView;
>
> public class ItemBinder implements SimpleCursorAdapter.ViewBinder {
>
>        public static final StringBuilder mBuilder = new StringBuilder();
>        public static final Formatter mFormatter = new Formatter(mBuilder);
>        public static final Object[] mArgs = new Object[1];
>
>        public boolean setViewValue(View view, Cursor cursor, int
> columnIndex) {
>                switch(view.getId()) {
>                case R.id.price:
>                        // Format the price nicely
>                        String price = cursor.getString(columnIndex);
>                        final float pricef = Float.parseFloat(price);
>                        Object[] args = mArgs;
>                        args[0] = pricef;
>                        mBuilder.setLength(0);
>                        price = mFormatter.format("%.2f", args).toString();
>                        ((TextView)view).setText(price);
>                        return true;
>                }
>                return false;
>        }
> }
> <END CODE>
>
>
>
>
>
> On Apr 13, 10:40 pm, Marco Nelissen <marc...@android.com> wrote:
>> Don't use String.format(). It creates all kinds of temporary objects
>> every time you call it.
>> Instead, create a single StringBuilder and Formatter, and then reuse
>> those every time you need to format a string.
>>
>> On Mon, Apr 13, 2009 at 7:37 PM, DavidG <dgu...@gmail.com> wrote:
>>
>> > In my ListView, there's one line of code in my ViewBinder that causes
>> > lots of garbage collection as I scroll through the list, about every
>> > two seconds...
>>
>> > D/dalvikvm(16312): GC freed 13171 objects / 659576 bytes in 162ms
>> > D/dalvikvm(16312): GC freed 13122 objects / 654128 bytes in 129ms
>> > D/dalvikvm(16312): GC freed 13134 objects / 655416 bytes in 142ms
>> > D/dalvikvm(16312): GC freed 13129 objects / 654840 bytes in 129ms
>> > D/dalvikvm(16312): GC freed 13149 objects / 655000 bytes in 110ms
>> > D/dalvikvm(16312): GC freed 13150 objects / 655720 bytes in 127ms
>> > D/dalvikvm(16312): GC freed 13075 objects / 652256 bytes in 111ms
>> > D/dalvikvm(16312): GC freed 13232 objects / 659040 bytes in 136ms
>> > D/dalvikvm(16312): GC freed 13106 objects / 653920 bytes in 110ms
>> > D/dalvikvm(16312): GC freed 13155 objects / 655152 bytes in 110ms
>>
>> > The offending code is here, which formats a price for each item in the
>> > list:
>>
>> > String price = cursor.getString(columnIndex);
>> > final float pricef = Float.parseFloat(price);
>> > price = new StringBuffer("$").append(String.format("%.
>> > 2f",pricef)).toString();
>> > ((TextView)view).setText(price);
>>
>> > If I comment out the line with String.format, the garbage collection
>> > goes away. So what's the "right" way to do this to avoid allocations?
>> > That database field holds an unformatted text string which I'm trying
>> > to format into proper currency format (example: format "1.5" to
>> > "$1.50")
>>
>> > Any pointers on how to improve this?
>>
>>
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers-unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to