旋转手机时如何最好地重新创建标记/折线(方向更改)

use*_*068 14 android android-maps-v2

背景:

  • 开发使用Android Google Map v2的原生Android应用程序android.support.v4.app.FragmentActivity.在Android v2.2上运行.

目的:

  • 在电话方向改变之前,保留在地图上"绘制"标记/折线.

问题(S):

  1. 我可以标记/折线"保存"作为软件包的一部分,只需将其储存在他们重新显示onSaveInstanceState使用适当的savedInstance.put..方法和然后"恢复"他们onCreate使用适当的savedInstanceState.get..方法.

    在查看Marker的描述getID()时,当Marker.getId()方法的Google文档声明如下时,我很困惑:

    从Bundle 恢复地图时,也会恢复该地图上的标记.但是,这些标记将由不同的标记对象表示.标记的id可用于在此类恢复之后检索Marker对象的新实例.

    谷歌文档(上面的粗体文字)使得听起来像标记只是自动恢复而无需采取任何行动.那不是我的经历......也许我错误地解释了所陈述的内容.或者你可能必须在Bundle中明确保存地图?有人可以澄清这意味着什么吗?

  2. 假设我必须通过适当的savedInstance.put...方法明确地将标记和折线保存到包中,我应该保存整个标记还是应该保存标记ID并使用标记ID检索标记信息以重新显示标记?我找不到一种put方法可以让我保存整个标记.

    我注意到,MapFragment部分谷歌地图API的Android V2它的声明如下:

    从GoogleMap获取的任何对象都与视图相关联.重要的是不要在视图的生命之外保持对象(例如标记).否则会导致内存泄漏,因为视图无法释放.

    这个陈述让我相信我不应该尝试保存标记本身,而是尝试保存标记id,然后根据与标记id关联的标记对象重新生成标记.同样对于PolyLines.我的假设是否正确?

  3. 另外,我应该避免将Marker作为类变量吗?我担心的是,如果Marker是一个类变量,并且Activity Map片段放在后面的堆栈上,这可能会导致内存泄漏,因为它将有效地"保持对象",如前面提到的文档中所述.这是我应该关注的吗?

问候.

Mac*_*ski 14

我可以将标记/折线"保存"为捆绑包的一部分,只需使用适当的"savedInstance.put .."方法将它们保存在onSaveInstanceState中,然后使用适当的"恢复"在onCreate中"重新"显示它们. savedInstanceState.get .."方法.

没有.

谷歌文档(上面的粗体文字)使得听起来像标记只是自动恢复而无需采取任何行动.那不是我的经历......也许我错误地解释了所陈述的内容.或者你可能必须在Bundle中明确保存地图?有人可以澄清这意味着什么吗?

你没有误解任何东西.文档不正确.

我应该保存标记ID并使用标记ID检索标记信息以重新显示标记

标记ID在配置更改中不是永久性的 - 它取决于可视对象创建的顺序(首先调用addMarker返回具有ID"m1"的对象,第二个"m2").你不能以任何方式使用这个值(从API版本3.1.36开始)和恕我直言,它确实没有任何意义.我实际上已经将与ID相关的问题进行了总结.有至少应该是一个函数GoogleMap.getMarkerById(String)用于Marker.getId()做毫无意义.

3)另外,我应该避免将标记作为类变量吗?我担心的是,如果Marker是一个类变量,并且Activity Map片段放在后面的堆栈上,这可能会导致内存泄漏,因为它将有效地"保持对象",如前面提到的文档中所述.这是我应该关注的吗?

是.保持静态引用Marker或任何其他可视对象会导致泄漏.


并非回答所有问题和疑虑使其更接近解决方案,所以这是我的主张.

我假设你有一个数据组Markers,并Polylines从创建并可能将其存储在数据库是从web服务获取后.现在,如果你从数据库中加载它AsyncTask在你的Activity或者甚至没有将其存储在DB,但只取中Activity直接-这是很糟糕.

尽量使您的数据尽可能可访问,因此只需在进程被终止后(或在内存不足时丢弃它)后重新加载到内存中.如果你这样做 - 这很好.当然不是全部:如果你有20000个标记,每个标记都在信息窗口显示,它可以等待...

现在你拥有了在内存中创建标记所需的所有数据,只需像第一次那样创建它们.无需其他代码.

我们可以争论这是好的还是坏的想法,我会改进答案,但这需要更多关于上下文的信息:

  • 有多少标记和折线
  • 你有什么额外的数据
  • 你在哪里保留你的模型
  • 等等

当然还有另一种方法:你可以给MarkerOptionsonSaveInstanceState.如果您保持最新状态,或者如果您Markers没有更改,并且如果没有这么多,这可能对您有用.我无法理解在每次旋转或按HOME按钮时通过IPC发送数千个对象.


luc*_*cas 13

在我看来,调用setRetainInstance(true);保存地图的片段会通过暂停,方向更改等保留地图上的所有内容,而不必担心设置和获取.有什么理由说这不是推荐的方法吗?