Thanks for the suggestions, I'll work with that a little more. I actually found another solution that seems to work well for me. Instead of using Formatter, I used NumberFormat:
private static final NumberFormat nf = NumberFormat.getCurrencyInstance (); Then I just call nf.format(price) and it works without the garbage collection, plus I get the benefit of formatting the currency to the current locale. The only difference is it requires that I use double instead of float. But so far, so good! On Apr 14, 5:16 pm, Marco Nelissen <[email protected]> wrote: > 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 <[email protected]> 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 formatterline(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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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 [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/android-developers?hl=en -~----------~----~----~----~------~----~------~--~---

