在我的应用程序中有一个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)
答案 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可以处理的叠加项数量有限制。关于这个限制是什么没有正式的说法,但过了一段时间,你会在缩放/平移期间看到缓慢的行为。
有些解决方案是:
只加载可见的标记,根据缩放级别和范围执行此操作。
99个点的10个叠加比900个点的1个叠加快。