首先,我是一位拥有iOS背景的新Android开发人员,这是我的第一篇文章。
现在开展业务,我正在使用MapQuest SDK 1.0.5开发一个应用程序,其中包含一个MapView,它会定期更新新数据(如导航历史记录和到目的地的路径)。
我的问题是在一些invalidate()调用应用程序崩溃之后。 使用新数据更新地图需要使用invalidate调用。 调用是从主线程完成的。
private void updateMap()
{
// remove old data from the map
.....
// add new data to the map
// update map with new data
mapView.invalidate();
}
过了一段时间我得到警告:
E/Looper﹕ WARNING: The Looper class instance count has over a limit(100). There should be some leakage of Looper or HandlerThread.
E/Looper﹕ Looper class instance count = 304
E/Looper﹕ Current Thread Name: simplifier
应用程序通常在我的测试设备上以~300崩溃:
E/[EGL-ERROR]﹕ void __egl_platform_dequeue_buffer(egl_surface*):1779: failed to dequeue buffer from native window 0x61c14a28; err = -2147483646, buf = 0x0,max_allowed_dequeued_buffers 3
E/[EGL-ERROR]﹕ void __egl_platform_dequeue_buffer(egl_surface*):1779: failed to dequeue buffer from native window 0x61c14a28; err = -16, buf = 0x0,max_allowed_dequeued_buffers 3
W/MALI﹕ _gles_set_error:82: [WARNING]Mali GLES errorcode: 501
E/OpenGLRenderer﹕ GL_INVALID_VALUE
E/[EGL-ERROR]﹕ void __egl_platform_dequeue_buffer(egl_surface*):1779: failed to dequeue buffer from native window 0x61c14a28; err = -16, buf = 0x0,max_allowed_dequeued_buffers 3
E/[EGL-ERROR]﹕ void __egl_platform_dequeue_buffer(egl_surface*):1779: failed to dequeue buffer from native window 0x61c14a28; err = -16, buf = 0x0,max_allowed_dequeued_buffers 3
A/Looper﹕ Could not create wake pipe. errno=24
A/libc﹕ Fatal signal 6 (SIGABRT) at 0x000001e5 (code=-6), thread 3944 (simplifier)
我真的不知道该做什么,整天都在这上班。
编辑30.06.2015
管理找到问题的根源,在更新方法中我添加和删除地图中的叠加项目,但是当我添加新的LineOverlay项目时,会创建一个后台线程并且它永远不会停止即使中断它。
mapView.getOverlays().add(overlay);
问题是只有当我添加LineOverlay项(Overlay的子类)时才创建线程,如果我添加DefaultItemizedOverlay,例如一切正常。
这是我在getOverlays()的文档中找到的:
返回重叠列表对象。使用此选项可以在MapView中添加和删除叠加层。该列表在外部同步,但如果迭代则必须在列表实例上同步。
我猜这个部分"外部同步"导致问题。
有什么建议吗?