I'm glad that you've found a solution that works for you. Yes,
unfortunately while we expect most Android devices to be pretty
powerful and have fairly large amounts of memory, they still aren't
desktop machines and more careful design and implementation will
sometimes be necessary.

Cheers,
Justin
Android Team @ Google

On Dec 9, 5:42 pm, mscwd01 <[EMAIL PROTECTED]> wrote:
> Hi Justin,
>
> I too have spent a great deal of time debugging this - with little
> luck.
> Thanks for taking the time to explain your findings, it does help to
> understand what was going on.
>
> In the end I chose to redesign my application and use just the one
> MapView - mainly due to the memory issues.
>
> The reason I found myself in this problem was due to the fact I needed
> a TabHost and a MapView in the same activity. However I found I
> couldn't extend both a TabActivity and MapActivity in the same
> Activity so I opted to create my own "TabbedMapActivity", created
> using the Android source code.
>
> I explained it all here if you want to see how I achieved 
> this:http://groups.google.com/group/android-developers/browse_thread/threa...
>
> Ultimately, I believe you are right, having multiple MapViews will
> inevitable lead to memory issues regardless of how careful you are to
> save map states and recycle resources; so I think using just the one
> MapView is the only answer at this moment in time.
>
> Thanks
>
> On Dec 9, 11:49 pm, "Justin (Google Employee)" <[EMAIL PROTECTED]>
> wrote:
>
> > Once upon a time I spent a lot of time debugging this issue, so here
> > is what I found.
>
> > ***WARNING: This information was valid on an internal version of the
> > SDK between M5-RC15 and 0.9 beta, it may no longer be valid, test
> > thoroughly and proceed with  caution.***
>
> > First, some information about MapView and MapActivity. Each Android
> > process may have multiple MapViews and MapActivitys, but they all
> > manipulate a single MapView backing object. This is because MapViews
> > take a *huge* amount of memory, roughly half of the 16MB allowed to
> > each application. This *also means* you need to be very careful about
> > your memory usage when using MapView. Make sure to use DDMS to analyze
> > memory usage to make sure you don't run out of space. Because a single
> > view backs all map views in an application, you also need to save and
> > restore the map state (including center position and zoom) when your
> > MapActivity subclass pauses/resumes.
>
> > For the purposes of discussion I will refer to two activities,
> > ActivityAlpha and ActivityBeta, each is a subclass of MapActivity and
> > has a MapView. ActivityAlpha starts ActivityBeta. The user will
> > eventually return to ActivityAlpha either via the 'back' button or
> > ActivityBeta finishing naturally.
>
> > When ActivityBeta finishes, there are two issues that I believe causes
> > the problem you see:
>
> > 1) onCreate is not called on the launching ActivityAlpha, onResume is
> > 2) a certain UI focal change doesn't occur
>
> > Certain initialization of the MapView and various helper entities are
> > done by MapActivity when onCreate is called. When ActivityBeta is
> > launched, onPause is called on ActivityAlpha and the helpers for the
> > MapView are stopped. onResume does some of the restarting, but clearly
> > not all that is necessary. This can be worked around by calling
> > super.onCreate(null) from your onResume or onActivityResult method of
> > your launching MapActivity subclass. ***WARNING***: This is
> > potentially very dangerous, MapActivity may not expect to be abused
> > this way, test thoroughly and proceed with caution.
>
> > The second issue results in the above hack not quite working. When
> > ActivityBeta finishes, and the above hack is applied, ActivityAlpha is
> > ready to load tiles, but it won't until the MapView is touched so that
> > the MapView checks to see if it needs tiles. So far, I don't have a
> > workaround for this, possibly a programmatic pan or zoom would cause
> > the MapView to load any missing tiles. Some of my previous testing
> > also indicated that any missing tiles would load when ActivityAlpha
> > resumes if you use startActivity() to start ActivityBeta instead of
> > startActivityForResult().
>
> > The bottom line is that maps were never designed to have multiple map
> > views in a single application, they're very heavy objects. Hopefully
> > this helps and is still valid information, let me know how it goes.
>
> > Cheers,
> > Justin
> > Android Team @ Google
>
> > On Dec 8, 5:39 pm, mscwd01 <[EMAIL PROTECTED]> wrote:
>
> > > Having tried the test you suggested it seems I can go back and forth
> > > between my Activity1 map and the inbuilt Google Maps app perfectly
> > > fine - no memory worries. However my application, constantly throws up
> > > OutOfMemory errors.
>
> > > One thing I have noticed is after Activity1 calls Activity2, Activity1
> > > is never able to load additional tiles. It seems Activity2, even if it
> > > is destroyed after pressing the back button and returning to Activity1
> > > always retains some kind of "focus" - If you reopen Activity 2, the
> > > map is able to load new tiles. Very strange...
>
> > > On Dec 8, 11:47 pm, Mark Murphy <[EMAIL PROTECTED]> wrote:
>
> > > > mscwd01 wrote:
>
> > > >  > Hope I havent confused you ;)
>
> > > > No, but you have made my head hurt.
>
> > > >  > Oh btw I purchased your "The Busy Coder's Guide to Android
> > > >  > Development" book - its very helpful ;)
>
> > > > My head feels better now... ;-)
>
> > > > > However what i'm asking is, is there a way to kill off Activity2
> > > > > completely when pressing the Back button to return to Activity1 and
> > > > > return full control to the first map?
>
> > > > Well, you already tried the stock answer of using finish(). With your
> > > > kill-my-process hack, you're heading down in a direction which, on my
> > > > map of Android, is labeled "Here There Be Dragons"...
>
> > > >  > I believe I am making more and
>
> > > > > more map objects when I launch Activity2 again and again and not
> > > > > releasing resources when I finish with it?
>
> > > > Or they're just not getting garbage collected fast enough or something.
>
> > > > I have a suggestion. I have no idea how crazy it will be for you to
> > > > utilize if it works.
>
> > > > In Activity1, temporarily replace launching Activity2 with a
> > > > startActivity() that launches the built-in Maps application. You should
> > > > be able to do this through:
>
> > > > startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("geo:40,-75")));
>
> > > > which will give you a map of the NJ side of the Philadelphia suburbs.
>
> > > > Now, try bouncing back and forth between your Activity1 and the Maps
> > > > application, like you were bouncing between Activity1 and Activity2.
>
> > > > If things fail as before, I think you may just be screwed, at least in
> > > > terms of rapidly flipping between two MapView instances. They may make
> > > > too much garbage.
>
> > > > If, however, this holds up, it may be you can only effectively have one
> > > > MapView per *application* if you want to rapidly switch between them. In
> > > > that case, your mission (should you choose to accept it) is to split
> > > > your project into two separate applications. This would suck mightily,
> > > > particularly if you were looking to deploy via a market, but it's
> > > > possible it is the best way for you to get two stable MapViews under
> > > > your control.
>
> > > > If it were me, I'd try very very hard to get by with one map, somehow.
>
> > > > --
> > > > Mark Murphy (a Commons Guy)http://commonsware.com
> > > > _The Busy Coder's Guide to Android Development_ Version 1.9 Available!
>
>
--~--~---------~--~----~------------~-------~--~----~
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
[EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to