Android 向MapView添加覆盖项的速度非常低,如何使其更快?

Android 向MapView添加覆盖项的速度非常低,如何使其更快?,android,android-mapview,android-maps,itemizedoverlay,Android,Android Mapview,Android Maps,Itemizedoverlay,在我的应用程序中有一个MapView,我向它添加了覆盖项,大约500个,但将来会增加到数千个 我的问题是: 当我切换到这个活动,我得到了一个巨大的3-4秒停电,然后它切换正确,我可以导航和点击地图 几个月前,当应用程序在mapView中只包含50-150个地质点时,没有停电。因此,我认为我的OverlayItem添加到mapView有问题,它确实会减慢应用程序的速度 我在活动启动时通过简单的循环添加地质点 我可以做些什么来加快此活动并防止停电 编辑: 多亏了注释,我才意识到我在每次AddOver

在我的应用程序中有一个MapView,我向它添加了覆盖项,大约500个,但将来会增加到数千个

我的问题是: 当我切换到这个活动,我得到了一个巨大的3-4秒停电,然后它切换正确,我可以导航和点击地图

几个月前,当应用程序在mapView中只包含50-150个地质点时,没有停电。因此,我认为我的OverlayItem添加到mapView有问题,它确实会减慢应用程序的速度

我在活动启动时通过简单的循环添加地质点

我可以做些什么来加快此活动并防止停电

编辑:

多亏了注释,我才意识到我在每次AddOverlyMyOverlayItem 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)

尝试在线程或异步任务中加载覆盖项,并使它们在加载时显示。
通过这种方式,您可以停止断电。但是覆盖可能会延迟显示。

尝试在线程或异步任务中加载覆盖项,并使其在加载时显示。
通过这种方式,您可以停止断电。但是叠加显示可能会延迟。

直接从官方指南:

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


我建议使用加载器,因为它们是一种非常聪明的系统管理方式,可以进行良好的后台处理

直接从官方指南:

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


我建议使用加载器,因为它们是一种非常聪明的系统管理方式,可以进行良好的后台处理

MapView可以处理的覆盖项目数量有限。目前还没有关于这个限制的官方说法,但过一段时间后,你会看到缩放/平移过程中的缓慢行为

一些解决办法是:

仅加载尽可能多的可见标记,根据缩放级别和范围执行此操作

具有99个点的10个叠加比具有900个点的1个叠加快


MapView可以处理的覆盖项目数量有限。目前还没有关于这个限制的官方说法,但过一段时间后,你会看到缩放/平移过程中的缓慢行为

一些解决办法是:

仅加载尽可能多的可见标记,根据缩放级别和范围执行此操作

具有99个点的10个叠加比具有900个点的1个叠加快


通过以下操作,您可以显著提高ItemizeOverlay加载时间:

诀窍1:

这是最重要的。确保不是每次添加一项时都调用“填充”。相反,在加载所有项之后,只加载所有项并调用填充一次。这将显著提高加载速度,在几毫秒内加载1000个项目

技巧二: 如果在上述步骤之后加载速度仍然减慢,那么延迟可能是从获取要加载的项目sqlite、文件等的位置开始的。。例如,根据您的数据库结构,从sqlite加载1000个项目可能需要3到4秒。为了改进这一点,您可以重新设计数据库结构,或者在异步任务中从数据库加载项


注意。

通过以下操作,您可以显著提高ItemizedOverlay加载时间:

诀窍1:

这是最重要的。确保不是每次添加一项时都调用“填充”。相反,在加载所有项之后,只加载所有项并调用填充一次。这将显著提高加载速度,在几毫秒内加载1000个项目

技巧二: 如果在上述步骤之后加载速度仍然减慢,那么延迟可能是从获取要加载的项目sqlite、文件等的位置开始的。。例如,根据您的数据库结构,从sqlite加载1000个项目可能需要3到4秒。为了改进这一点,您可以重新设计数据库结构,或者在异步任务中从数据库加载项

问候。

谢谢,我成功了!谢谢,我成功了!
Any slow, blocking operations in an activity should be done in a new thread,
to avoid slowing down the user interface