1

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

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

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

我在 Activity 启动时通过一个简单的循环添加我的 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

4 回答 4

3

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

于 2012-11-12T10:30:09.100 回答
3

您可以ItemizedOverlay通过以下方式显着缩短加载时间:

Trick 1:

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

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

问候。

于 2012-11-12T11:24:14.823 回答
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 线程上进行所有处理已经是一个坏主意。

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

于 2012-11-12T10:35:45.797 回答
1

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

一些解决方案是:

  1. MapviewOverLay 延迟加载

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

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

于 2012-11-12T10:36:51.753 回答