Background:
android.support.v4.app.FragmentActivity
. Runs on An
Can I "save" the markers/polylines as part of the bundle and simply have them re-displayed by saving them in the onSaveInstanceState using the appropriate "savedInstance.put.." methods and then "restore" them in onCreate using the appropriate "savedInstanceState.get.." methods.
No.
The Google documentation (bolded text above) makes it sound like the Marker's are just automagically restored without having to take any action. That isn't my experience...Maybe I'm mis-interpreting what is being stated. Or maybe you have to explicitly save map in the Bundle? Can someone clarify what this means?
You are not mis-interpreting anything. The documentation is incorrect.
should I save the Marker ID and retrieve the marker info using the marker ID to re-display the marker
Marker ID is not something permanent across configuration changes - it depends on the sequence of visual objects creation (first call to addMarker
returns object with ID "m1", second "m2"). You cannot use this value in any way (as of API version 3.1.36) and IMHO there is really no point in its existance. I have actually sumbited an issue related to ID. There should at least be a function GoogleMap.getMarkerById(String)
for Marker.getId()
to make little sense.
3) Also, should I avoid having the Marker as a Class variable? My concern is that if the Marker is a class variable and the Activity Map fragment is placed on the back stack that this could cause a memory leak because it will effectively be "holding on to the object" as noted in the aforementioned documentation. Is this something I should be concerned about?
Yes. Keeping a static reference to Marker
or any other visual object leads to a leak.
Not that answering all your questions and concerns made it closer to the solution, so here are my propositions.
I assume you have a data set that Markers
and Polylines
are created from and probably store it in DB after being fetched from webservice. Now if you load it from DB in AsyncTask
in your Activity
or not even store it in DB
, but only fetch in Activity
directly - that's bad.
Try to make your data as accessible as possible, so it only has to be reload into memory after process is killed (or after you drop it when low on memory). If you do that - that's good. Of course not all: if you have 20000 markers and each has its image displayed on info window, it can wait...
Now that you have all the data needed to create markers in memory, just create them like you would the first time. No additional code required.
We can argue about this being good or bad idea and I will improve the answer, but this requires more info about the context:
There is another way of course: you can send MarkerOptions
in onSaveInstanceState
. This might work for you if you keep it up-to-date or if your Markers
do not change and if there are not so many of them. I can't make sense of sending thousands of objects via IPC on every rotation or pressing HOME button.
It seems to me that calling setRetainInstance(true);
on the fragment that holds the map retains everything on the map through pauses, orientation changes, etc, without having to worry about setting and getting. Is there some reason why this isn't the recommended approach?