将OverlayItems添加到MapView真的很慢,如何让它更快?

时间:2012-11-12 10:23:48

标签: android android-mapview android-maps itemizedoverlay

在我的应用程序中有一个MapView,我将OverlayItems添加到它,大约500 但是将来会有更多甚至数千个......

我的问题是: 当我切换到此活动时,我有大约3-4秒的停电然后它正常切换,我可以导航并点按地图。

几个月前,当应用程序在mapView中只包含50-150个GeoPoints时,没有停电。所以我认为我的OverlayItem添加到mapView有问题,它真的慢了应用程序。

我在活动启动时添加了一个简单循环的GeoPoints。

如何才能使此活动更快并防止停电?

编辑:

感谢评论,我在每次 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)

4 个答案:

答案 0 :(得分:3)

尝试在线程或asynctask中加载叠加项,并在加载时显示它们。 通过这种方式,您可以停止停电。但是可能会延迟显示叠加层。

答案 1 :(得分:3)

执行以下操作可能会显着提高ItemizedOverlay加载时间:

Trick 1:

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

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

问候。

答案 2 :(得分:1)

直接来自官方指南: 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线程上进行所有处理已经是一个坏主意。

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

答案 3 :(得分:1)

MapView可以处理的叠加项数量有限制。关于这个限制是什么没有正式的说法,但过了一段时间,你会在缩放/平移期间看到缓慢的行为。

有些解决方案是:

  1. MapviewOVerLay with Lazy Loading

  2. 只加载可见的标记,根据缩放级别和范围执行此操作。

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