I don't know then. I don't think that Formatter.format() should create
that many temporary objects. Have you tried formatting the number
differently, like as an integer? (note also that if this is a sqlite
based cursor, I think you can just getFloat() the column, so you don't
have to parse a string in to a float)



On Tue, Apr 14, 2009 at 2:29 PM, DavidG <dgu...@gmail.com> wrote:
>
> That's right, with the code above, it still GCs about 13000 every 2
> seconds (as long as I'm scrolling the list quickly back and forth). If
> I comment out the formatter line (price = mFormatter.format("%.2f",
> args).toString();) it doesn't do the GCs anymore, but I of course lose
> my formatting.
>
> On Apr 14, 10:28 am, Marco Nelissen <marc...@android.com> wrote:
>> When you say that it hasn't improved yourgarbagecollection 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 thegarbage
>> > 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 mygarbagecollection 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'sonelineof code in my ViewBinder that causes
>> >> > lots ofgarbagecollection 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 thelinewith String.format, thegarbagecollection
>> >> > 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