【问题标题】:Adding OverlayItems to MapView is reallyslow, how to make it faster?将 OverlayItems 添加到 MapView 真的很慢,如何使它更快?
【发布时间】:2012-11-12 10:23:47
【问题描述】:

在我的应用程序中有一个 MapView,我在其中添加了 OverlayItems,大约 500 个但未来会更多,甚至数千个...... p>

我的问题是: 当我切换到此 Activity 时,我出现了 3-4 秒的大停电,然后它会正确切换,我可以导航并点击地图。

几个月前,当该应用在 mapView 中仅包含 50-150 个 GeoPoints 时,并没有停电。所以我认为我的 OverlayItem 添加到 mapView 有问题,它确实会减慢应用程序的速度。

我在 Activity 启动时通过一个简单的循环添加我的 GeoPoints。

我可以做些什么来使这个活动更快并防止停电?

编辑:

感谢 cmets,我才意识到我在每次 addOverlay(MyOverlayItem myoverlay) 函数调用之后都调用了 populate()

我编辑了代码,现在在循环之后我只调用它一次:

public void populateNow()
    {

        populate();

    }

但是我刚刚得到了一个很好的空指针异常...... 有什么想法吗?

11-12 15:54:03.398: E/MapActivity(1534): Couldn't get connection factory client
11-12 15:54:03.531: E/AndroidRuntime(1534): FATAL EXCEPTION: main
11-12 15:54:03.531: E/AndroidRuntime(1534): java.lang.NullPointerException
11-12 15:54:03.531: E/AndroidRuntime(1534):     at com.google.android.maps.ItemizedOverlay.getIndexToDraw(ItemizedOverlay.java:211)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at com.google.android.maps.ItemizedOverlay.draw(ItemizedOverlay.java:240)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at com.google.android.maps.Overlay.draw(Overlay.java:179)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at com.google.android.maps.OverlayBundle.draw(OverlayBundle.java:42)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at com.google.android.maps.MapView.onDraw(MapView.java:530)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at android.view.View.draw(View.java:6933)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at android.view.View.draw(View.java:6936)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at android.widget.FrameLayout.draw(FrameLayout.java:357)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at android.view.View.draw(View.java:6936)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at android.widget.FrameLayout.draw(FrameLayout.java:357)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1904)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at android.view.ViewRoot.draw(ViewRoot.java:1527)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at android.view.ViewRoot.performTraversals(ViewRoot.java:1263)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1865)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at android.os.Looper.loop(Looper.java:123)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at android.app.ActivityThread.main(ActivityThread.java:3687)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at java.lang.reflect.Method.invokeNative(Native Method)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at java.lang.reflect.Method.invoke(Method.java:507)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
11-12 15:54:03.531: E/AndroidRuntime(1534):     at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 谢谢,populate() 成功了!

标签: android android-mapview android-maps itemizedoverlay


【解决方案1】:

您可以通过以下方式显着改善ItemizedOverlay 的加载时间:

Trick 1:

这是最重要的。确保您不是每次添加一项时都调用populate()。相反,加载所有项目并在加载所有项目后仅调用一次populate()。这大大提高了加载速度,1000 个项目应在几毫秒内加载。

Trick 2: 如果在上述步骤之后加载仍然变慢,则延迟可能来自您获取要加载的项目的位置(sqlite、文件等)。例如,根据您的数据库结构,从 sqlite 加载 1000 个项目可能需要 3 到 4 秒。为了改进这一点,您可以重新设计您的数据库结构或从AsyncTask 中的数据库加载项目。

问候。

【讨论】:

    【解决方案2】:

    尝试在线程或异步任务中加载叠加项目,并使其在加载时显示。 这样你就可以停止停电了。但是叠加层可能会延迟显示。

    【讨论】:

      【解决方案3】:

      直接来自官方指南: http://developer.android.com/guide/components/processes-and-threads.html

      Any slow, blocking operations in an activity should be done in a new thread,
      to avoid slowing down the user interface
      

      只有 50 到 150 个元素,它的处理速度仍然足够快,因此 UI 不会注意到,但在主 UI 线程上进行所有处理已经是一个坏主意。

      我建议使用加载器,因为它们是一种非常聪明的系统管理方式,可以很好地进行后台处理。 http://developer.android.com/guide/components/loaders.html

      【讨论】:

        【解决方案4】:

        MapView 可以处理的叠加项目的数量是有限制的。这个限制是什么没有官方消息,但一段时间后,您会看到缩放/平移过程中的缓慢行为。

        一些解决方案是:

        1. MapviewOVerLay with Lazy Loading

        2. 仅加载尽可能多的可见标记,根据缩放级别和跨度执行此操作。

        3. 10 个 99 点的叠加层比 1 个 900 个点的叠加层快。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-08-23
          • 2015-07-17
          • 1970-01-01
          • 2023-02-16
          • 1970-01-01
          • 1970-01-01
          • 2016-06-15
          • 2021-09-25
          相关资源
          最近更新 更多