gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:56:38 25 4
gpt4 key购买 nike

背景:

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

目标:

  • 在更改手机方向之前保留在 map 上“绘制”的标记/折线。

问题:

  1. 我能否将标记/多段线“保存”为包的一部分,并通过使用适当的 savedInstance.put 将它们保存在 onSaveInstanceState 中来简单地重新显示它们。 . 方法,然后使用适当的 savedInstanceState.get.. 方法在 onCreate 中“恢复”它们。

    在查看 Marker getID() 的描述时,我对 Marker.getId() method 的 Google 文档感到困惑。陈述如下:

    When a map is restored from a Bundle, markers that were on that map are also restored. However, those markers will then be represented by different Marker objects. A marker's id can be used to retrieve the new instance of a Marker object after such restoration.

    Google 文档(上面的粗体文本)听起来好像标记的只是自动恢复而无需采取任何操作。那不是我的经验……也许我误解了所陈述的内容。或者,也许您必须在 Bundle 中明确保存 map ?谁能解释一下这是什么意思?

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

    我注意到 MapFragment section Google Maps Android API v2 声明如下:

    Any objects obtained from the GoogleMap is associated with the view. It's important to not hold on to objects (e.g. Marker) beyond the view's life. Otherwise it will cause a memory leak as the view cannot be released.

    这句话让我相信我不应该尝试保存标记本身,而是尝试保存标记 ID,然后根据与标记 ID 关联的标记对象重新生成标记。折线也是如此。我的假设正确吗?

  3. 另外,我应该避免将标记作为类变量吗?我担心的是,如果 Marker 是一个类变量并且 Activity Map fragment 被放置在返回堆栈上,这可能会导致内存泄漏,因为它将有效地“保持在对象上”,如上述文档中所述。这是我应该关心的事情吗?

问候。

最佳答案

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.

没有。

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?

您没有误解任何内容。文档不正确。

should I save the Marker ID and retrieve the marker info using the marker ID to re-display the marker

标记 ID 在配置更改时不是永久性的 - 它取决于视觉对象创建的顺序(第一次调用 addMarker 返回 ID 为“m1”的对象,第二次调用“m2”)。您不能以任何方式使用此值(从 API 版本 3.1.36 开始)并且恕我直言,它的存在确实没有意义。我实际上已经提交了an issue related to ID .至少应该有一个函数 GoogleMap.getMarkerById(String) 用于 Marker.getId() 没有什么意义。

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?

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


并不是说回答了您所有的问题和疑虑就离解决方案更近了,所以这是我的建议。

我假设您有一个数据集,MarkersPolylines 是从中创建的,并且可能在从 web 服务获取后将其存储在数据库中。现在,如果您在 ActivityAsyncTask 中从 DB 加载它,或者甚至不将其存储在 DB 中,而仅在 Activity< 中获取 直接 - 这很糟糕。

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

现在您已经拥有在内存中创建标记所需的所有数据,只需像第一次一样创建它们。无需额外代码。

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

  • 有多少标记和折线
  • 您还有哪些其他数据
  • 你把模型放在哪里
  • 等等

当然还有另一种方式:可以在onSaveInstanceState中发送MarkerOptions。如果您保持它是最新的,或者如果您的 Markers 没有改变并且没有那么多,这可能对您有用。我无法理解每次旋转或按 HOME 按钮时都通过 IPC 发送数千个对象。

关于android - 旋转手机时如何最好地重新创建标记/折线(方向更改),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16902519/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com