Hi.

I may be wrong, but I velibe its normal.

When you are giving a resource as bitmap, i think it will reuse the same bitmap 
all the time, so you have 900 markers, but only a bitmap. But with your 
function you are creating 900 bitmaps, so you are eating a lot of memory. Also 
you arent disposing anything, try to dispose all the resources you will not use 
and may be it will work.

Also a GC.Collect can help.

Hope it helps.

Enviado desde mi iPad

El 04/07/2013, a las 16:44, Goncalo Oliveira <gonc...@minkan.net> escribió:

> Hi,
> 
> I'm facing an issue with Google maps and custom bitmaps as marker icons and 
> I'm a little confused if I'm doing the thing the wrong way or there's 
> something wrong happening either with Google maps component or with the 
> Xamarin - JVM bridge.
> 
> 1. I'm placing a huge quantity of markers on the map. Let's start with 900. 
> I'm generating random locations around a point to create these much different 
> LatLng objects.
> 
> Next, I do the following for each LatLng item.
> 
>                 string title = "Item " + ( itemIndex++ ).ToString(); // just 
> for readability
> 
>                 var iconMarkerOption = new MarkerOptions()
>                 .SetPosition( item )
>                 .SetSnippet( "Snippet" )
>                 .Anchor( 0.5f, 0.5f )
>                 .SetTitle( title );
> 
>                 map.AddMarker( iconMarkerOption );
> 
> Build, Run and... all's well. 900 markers on the screen and not a care in the 
> world.
> 
> 2. I don't want to use the default image, to I change the code to use my own.
> 
>                 var iconMarkerOption = new MarkerOptions()
>                 .SetPosition( item )
>                 .SetSnippet( "Snippet" )
>                 .Anchor( 0.5f, 0.5f )
>                 .InvokeIcon( BitmapDescriptorFactory.FromResource( 
> Resource.Drawable.ic_marker1 ) )
>                 .SetTitle( title );
> 
> Again, build, run and... all's well. 900 markers on the screen with my own 
> icon.
> 
> 3. I don't want just a standard image, I want to add some label text to each 
> icon. So I create the following method.
> 
>         private Paint paint = new Paint( PaintFlags.AntiAlias );
>         private Rect bounds = new Rect();
>         private BitmapDescriptor GetCustomBitmapDescriptor( string text )
>         {
>             Bitmap baseBitmap = BitmapFactory.DecodeResource( Resources, 
> Resource.Drawable.ic_marker1 );
>             Bitmap bitmap = baseBitmap.Copy( Bitmap.Config.Argb8888, true );
> 
>             paint.GetTextBounds( text, 0, text.Length, bounds );
> 
>             float x = bitmap.Width / 2.0f;
>             float y = ( bitmap.Height - bounds.Height() ) / 2.0f - bounds.Top;
> 
>             Canvas canvas = new Canvas( bitmap );
> 
>             canvas.DrawText( text, x, y, paint );
> 
>             BitmapDescriptor icon = BitmapDescriptorFactory.FromBitmap( 
> bitmap );
> 
>             return ( icon );
>         }
> 
> and I change my code
> 
>                 var iconMarkerOption = new MarkerOptions()
>                 .SetPosition( item )
>                 .SetSnippet( "Snippet" )
>                 .Anchor( 0.5f, 0.5f )
>                 .InvokeIcon( GetCustomBitmapDescriptor( title ) )
>                 .SetTitle( title );
> 
> Build, run and... out of memory.
> 07-04 15:32:35.055: E/mono(6005): Unhandled Exception:
> 07-04 15:32:35.055: E/mono(6005): Java.Lang.OutOfMemoryError: Exception of 
> type 'Java.Lang.OutOfMemoryError' was thrown.
> 07-04 15:32:35.055: E/mono(6005): at 
> Android.Runtime.JNIEnv.CallStaticObjectMethod 
> (intptr,intptr,Android.Runtime.JValue[]) <0x00080>
> 07-04 15:32:35.055: E/mono(6005): at 
> Android.Gms.Maps.Model.BitmapDescriptorFactory.FromBitmap 
> (Android.Graphics.Bitmap) <0x00103>
> 07-04 15:32:35.055: E/mono(6005): at 
> MapsExtensionsTest.MainActivity.GetCustomBitmapDescriptor (string) <0x001b7>
> 07-04 15:32:35.055: E/mono(6005): at 
> MapsExtensionsTest.MainActivity.button_Click (object,System.EventArgs) 
> <0x00187>
> 07-04 15:32:35.055: E/mono(6005): at 
> Android.Views.View/IOnClickListenerImplementor.OnClick (Android.Views.View) 
> <0x0005b>
> 07-04 15:32:35.055: E/mono(6005): at 
> Android.Views.View/IOnClickListenerInvoker.n_OnClick_Landroid_view_View_ 
> (intptr,intptr,intptr) <0x0005b>
> 07-04 15:32:35.055: E/mono(6005): at (wrapper dynamic-method) 
> object.d67d7456-e896-445d-be35-db0b39982fc0 (intptr,intptr,intptr) <0x00043>
> 07-04 15:32:35.055: E/mono(6005):   --- End of managed exception stack trace 
> ---
> 07-04 15:32:35.055: E/mono(6005): java.lang.OutOfMemoryError
> 07-04 15:32:35.055: E/mono(6005):     at 
> android.graphics.Bitmap.nativeCreateFromParcel(Native Method)
> 
> I tried changing the baseBitmap decoding to some place else, so that it's 
> only called once, as it's kind of lame to do this every single time.
> 
>         private Paint paint = new Paint( PaintFlags.AntiAlias );
>         private Rect bounds = new Rect();
>         Bitmap baseBitmap = null;
>         private BitmapDescriptor GetCustomBitmapDescriptor( string text )
>         {
>             if ( baseBitmap == null )
>             {
>                 baseBitmap = BitmapFactory.DecodeResource( Resources, 
> Resource.Drawable.ic_marker1 );
>             }
> 
>             Bitmap bitmap = baseBitmap.Copy( Bitmap.Config.Argb8888, true );
> 
>             paint.GetTextBounds( text, 0, text.Length, bounds );
> 
>             float x = bitmap.Width / 2.0f;
>             float y = ( bitmap.Height - bounds.Height() ) / 2.0f - bounds.Top;
> 
>             Canvas canvas = new Canvas( bitmap );
> 
>             canvas.DrawText( text, x, y, paint );
> 
>             BitmapDescriptor icon = BitmapDescriptorFactory.FromBitmap( 
> bitmap );
> 
>             return ( icon );
>         }
> 
> Build, run and... again, out of memory...
> 07-04 15:36:42.175: E/mono(6409): Java.Lang.OutOfMemoryError: Exception of 
> type 'Java.Lang.OutOfMemoryError' was thrown.
> 07-04 15:36:42.175: E/mono(6409): at Android.Runtime.JNIEnv.CallObjectMethod 
> (intptr,intptr,Android.Runtime.JValue[]) <0x00080>
> 07-04 15:36:42.175: E/mono(6409): at Android.Graphics.Bitmap.Copy 
> (Android.Graphics.Bitmap/Config,bool) <0x00167>
> 07-04 15:36:42.175: E/mono(6409): at 
> MapsExtensionsTest.MainActivity.GetCustomBitmapDescriptor (string) <0x00097>
> 07-04 15:36:42.175: E/mono(6409): at 
> MapsExtensionsTest.MainActivity.button_Click (object,System.EventArgs) 
> <0x00187>
> 07-04 15:36:42.175: E/mono(6409): at 
> Android.Views.View/IOnClickListenerImplementor.OnClick (Android.Views.View) 
> <0x0005b>
> 07-04 15:36:42.175: E/mono(6409): at 
> Android.Views.View/IOnClickListenerInvoker.n_OnClick_Landroid_view_View_ 
> (intptr,intptr,intptr) <0x0005b>
> 07-04 15:36:42.175: E/mono(6409): at (wrapper dynamic-method) 
> object.8ea9efe6-5373-404e-9980-0a2a1ca9397f (intptr,intptr,intptr) <0x00043>
> 07-04 15:36:42.175: E/mono(6409):   --- End of managed exception stack trace 
> ---
> 07-04 15:36:42.175: E/mono(6409): java.lang.OutOfMemoryError
> 07-04 15:36:42.175: E/mono(6409):     at 
> android.graphics.Bitmap.nativeCopy(Native Method)
> 07-04 15:36:42.175: E/mono(6409):     at 
> android.graphics.Bitmap.copy(Bitmap.java:403)
> 07-04 15:36:42.175: E/mono(6409):     at 
> mono.android.view.View_OnClickListenerImplementor.n_onClick(Native Method)
> 07-04 15:36:42.175: E/mono(6409):     at mono.androi
> 
> What can I do to avoid this? If the Google maps can do this when using the 
> resource id directly, there has to be a way, right?...
> 
> Any thoughts on this would be highly appreciated.
> 
> Cheers.
> 
> 
> -- 
> Gonçalo Oliveira
> 
> _______________________________________________
> Monodroid mailing list
> Monodroid@lists.ximian.com
> 
> UNSUBSCRIBE INFORMATION:
> http://lists.ximian.com/mailman/listinfo/monodroid
_______________________________________________
Monodroid mailing list
Monodroid@lists.ximian.com

UNSUBSCRIBE INFORMATION:
http://lists.ximian.com/mailman/listinfo/monodroid

Reply via email to