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 -~----------~----~----~----~------~----~------~--~---