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

Reply via email to