I finally found my issue.  For some reason:
face = Typeface.createFromAsset(context.getAssets(), "fonts/
sd_led_screen.ttf");
was not letting go of all its resources.  I am not sure the exact
mechanics but I think it was filling the cache and not releasing that
memory.

When I pull out the font into my singleton activity and reference it
from my overlays everything seems to work correctly and I don't run
out of memory quickly.

On Jan 11, 8:31 am, jgostylo <jgost...@gmail.com> wrote:
> I have done some additional investigation and it seems that many
> people are having similar symptoms but their fixes aren't working for
> me.  One person said they had threads that were not dying but I have
> checked that my thread count does not continually increase.
>
> I have been using ExecutorService as set up with
> Executors.newSingleThreadExecutor(); to run my server requests.  I
> also changed it to just run the handler as a normal thread to see if
> that would help out.
>
> I have several other Handlers running as ExecutorService in other
> activities as well as some processes running as a normal thread that
> uses newBM = BitmapFactory.decodeStream(bis); and those do not produce
> the memory leak.
>
> The issue seems to be narrowing down to the map overlays.  Can someone
> tell me how to accurately destroy an overlay because it seems like
> they are hanging around (though how to detect them I am not sure).
>
> On Jan 10, 8:21 am, jgostylo <jgost...@gmail.com> wrote:
>
>
>
> > I have been banging away at this one for weeks and I feel like I have
> > exhausted my research capabilities.  I am hoping that someone will see
> > my error in the code posted below.  The code is completely functional
> > doing everything I need, but there is a major memory leak.
>
> > When I try to track memory in the DDMS, the VM Heap tells me that my
> > object count is relatively stable and the used memory is also
> > relatively stable (it comes back down to a similar value after each GC
> > after panning).  When I look at the memory pie chart, the free memory
> > loses over 1meg of capacity with each map pan (overlay reload) and the
> > Unknown memory grows.  I have not found anything with the allocation
> > tracker.
>
> > Functional Summary:
> > I load overlays onto a map based on data I get from polling my
> > server.  When I pan the map far enough I clear the overlays and load
> > new ones.
>
> > MapFrontEnd.java  (snippets):
> > //header info
> > private List<Overlay> overlays;
>
> > //in onCreate
> > overlays = mapView.getOverlays();
> > ...
> > // here I attempt to fully clean up my old Overlays
> > for (Overlay i : overlays)
> > {
> >      if (i instanceof ParcelOverlay)
> >          ((ParcelOverlay) i).cleanUp();}
>
> > overlays.clear();
>
> > // and now I create the new overlays and add them to the Overlay list
> > int count = 0;
> > while (count < parcelData.length)
> > {
> >         try
> >         {
> >                 overlays.add(new ParcelOverlay(MapFrontEnd.this, parcelData
> > [count]));
> >         }
> > ...
> > count++;
>
> > }
>
> > ParcelOverlay.java (necessary snippets):
>
> > public class ParcelOverlay extends Overlay {
>
> >         private MapFrontEnd context;
> >         private Location location;
> >         private GeoPoint locationPoint;
> >         private int parcelSize;
> >         private int price;
> >         private String priceString;
> >         private String owner;
> >         private int buildingCount;
> >         private int haunted;
> >         private Bitmap buildingBitmap = null;
> >         private Bitmap ghostBitmap = null;
> >         private Bitmap presentBitmap = null;
>
> >         private boolean selected = false;
>
> >         private int backgroundColor;  // ARGB
> >         private int gridlineColor;
> >         private int selectedColor = 0xBBFAFA14;
>
> >         private Typeface face;
>
> >         // draw variables
> >         private GeoPoint sizePoint;
> >         private Paint rectOverlay = new Paint();
> >         private Paint rectGrid = new Paint();
> >         private Paint textPaint = new Paint();
> >         private Paint imagePaint = new Paint();
> >         Point topLeft = new Point();
> >         Point bottomRight = new Point();
>
> >         Point bottomLeft = new Point();
> >         Point topRight = new Point();
>
> >         public ParcelOverlay(MapFrontEnd _context, ParcelData _parcel) {
> >             super();
> >             context = _context;
> >             locationPoint = new GeoPoint(_parcel.latitude,
> > _parcel.longitude);
> >             parcelSize = _parcel.size;
> >             price = _parcel.cost;
> >             owner = _parcel.owner;
> >             buildingCount = _parcel.buildingNumber;
> >             haunted = _parcel.haunted;
> >             prize = _parcel.prize;
> >             priceString = Integer.toString(price);
>
> >             sizePoint = new GeoPoint(locationPoint.getLatitudeE6() +
> > parcelSize, locationPoint.getLongitudeE6() + parcelSize);
>
> >             face = Typeface.createFromAsset(context.getAssets(), "fonts/
> > sd_led_screen.ttf");
>
> >             setupColors();
>
> >                 textPaint.setColor(0xd8000000);
> >                 textPaint.setTextSize(25);
> >                 textPaint.setTypeface(face);
> >         }
>
> >         @Override
> >         public void draw(Canvas canvas, MapView mapView, boolean shadow) {
> >                // there are no new objects created in draw
> >                 if (shadow == false) {
> >                   ...
> >                   if (buildingBitmap != null)
> >                     canvas.drawBitmap(buildingBitmap, (float)(bottomLeft.x 
> > + 5),
> > (float)(topRight.y + 5), imagePaint);
>
> >                   if (ghostBitmap != null)
> >                         canvas.drawBitmap(ghostBitmap, (float)(topRight.x - 
> > 30), (float)
> > (topRight.y + 3), imagePaint);
>
> >                   if (presentBitmap != null)
> >                         canvas.drawBitmap(presentBitmap, (float)(topRight.x 
> > - 30),
> > (float)(bottomLeft.y - 16), imagePaint);
> >                   ...
> >                 }
> >                 super.draw(canvas, mapView, shadow);
> >            }
>
> >         private void setupColors()
> >         {
> >             ... //code for setting Paint colors
>
> >                 // set the building bitmap
> >             if (buildingCount > 5)
> >                 buildingBitmap = BitmapFactory.decodeResource
> > (context.getResources(), R.drawable.mainstreet);
> >             else if (buildingCount > 2)
> >                 buildingBitmap = BitmapFactory.decodeResource
> > (context.getResources(), R.drawable.tradingpost);
> >             else if (buildingCount > 0)
> >                 buildingBitmap = BitmapFactory.decodeResource
> > (context.getResources(), R.drawable.generalstore);
> >             else if (buildingCount == 0)
> >             {
> >                 if (buildingBitmap != null)
> >                 {
> >                         buildingBitmap.recycle();
> >                         buildingBitmap = null;
> >                 }
> >             }
> >             else
> >                 buildingBitmap = BitmapFactory.decodeResource
> > (context.getResources(), R.drawable.playerstore);
>
> >             if (haunted == 1)
> >                 ghostBitmap = 
> > BitmapFactory.decodeResource(context.getResources
> > (), R.drawable.ghostsmall);
> >             else if (ghostBitmap != null)
> >             {
> >                 ghostBitmap.recycle();
> >                 ghostBitmap = null;
> >             }
>
> >             if (prize == 1)
> >                 presentBitmap = 
> > BitmapFactory.decodeResource(context.getResources
> > (), R.drawable.present);
> >             else if (presentBitmap != null)
> >             {
> >                 presentBitmap.recycle();
> >                 presentBitmap = null;
> >             }
> >         }
>
> >         public void cleanUp()
> >         {
> >                 context = null;
>
> >                 if (buildingBitmap != null)
> >                 {
> >                         buildingBitmap.recycle();
> >                         buildingBitmap = null;
> >                 }
> >                 if (ghostBitmap != null)
> >                 {
> >                         ghostBitmap.recycle();
> >                         ghostBitmap = null;
> >                 }
> >                 if (presentBitmap != null)
> >                 {
> >                         presentBitmap.recycle();
> >                         presentBitmap = null;
> >                 }
> >         }
-- 
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