Sea*_*eau 10 android google-play-services google-maps-android-api-2
即使应用程序中没有任何内容发生,我也会在Android Maps API v2上看到地图上的标记.
这是一个行为视频:
我所期待的
标记应保持固定在原来添加的纬度/经度.
哪些步骤将重现该问题?
git clone https://github.com/OneBusAway/onebusaway-android.gitgit checkout v2.0.6gradlew installObaGoogleDebugadb shell am start -n com.joulespersecond.seattlebusbot/org.onebusaway.android.ui.HomeActivity我应该补充一点,我不能总是重现这一点.似乎一切都运行正常,但是当标记开始跳转时它们不会停止.
标记实施细节
加载用于9种标记类型(8个方向+无方向)的图标的代码位于:https: //github.com/OneBusAway/onebusaway-android/blob/master/onebusaway-android/src/google/java/组织/ onebusaway /安卓/地图/ googlemapsv2/StopOverlay.java#L175
我正在使用这个drawable:https: //github.com/OneBusAway/onebusaway-android/blob/master/onebusaway-android/src/main/res/drawable/map_stop_icon.xml
...这是一些形状 - 这创建了主要的绿色圆圈,白色轮廓和下降阴影.然后,我在8个方向中的每一个方向上绘制方向箭头 - 绘图方向的代码在这里:
在加载图标的代码中,我在第一次加载时为每个9种图标类型缓存BitmapDescriptor返回的内容BitmapDescriptorFactory.fromBitmap(),因此每次在地图上放置标记时都不会这样做.
我还看到应用程序崩溃"不幸的是,OneBusAway已停止." 让应用程序在地图屏幕上停留几分钟后,在Logcat中看到此异常:
08-10 16:40:02.422 15843-15929/com.joulespersecond.seattlebusbot E/AndroidRuntime? FATAL EXCEPTION: GLThread 8614
Process: com.joulespersecond.seattlebusbot, PID: 15843
java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.ComparableTimSort.mergeHi(ComparableTimSort.java:831)
at java.util.ComparableTimSort.mergeAt(ComparableTimSort.java:449)
at java.util.ComparableTimSort.mergeCollapse(ComparableTimSort.java:372)
at java.util.ComparableTimSort.sort(ComparableTimSort.java:178)
at java.util.ComparableTimSort.sort(ComparableTimSort.java:142)
at java.util.Arrays.sort(Arrays.java:1957)
at java.util.Collections.sort(Collections.java:1864)
at com.google.maps.api.android.lib6.gmm6.n.bl.a(Unknown Source)
at com.google.maps.api.android.lib6.gmm6.n.l.a(Unknown Source)
at com.google.maps.api.android.lib6.gmm6.n.l.b(Unknown Source)
at com.google.maps.api.android.lib6.gmm6.n.cv.f(Unknown Source)
at com.google.maps.api.android.lib6.gmm6.n.cv.run(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
我在LG G4和Nexus 6上看过这个.关于LG设备的更多细节如下.
LG G4 LS991搭载Android 5.1(LS991ZV4)
Google Play服务客户端库版本= compile 'com.google.android.gms:play-services-maps:7.5.0'和compile 'com.google.android.gms:play-services-maps:7.8.0'
设备上的Google Play服务版 - Google Play Services 7.8.99(2134222-440)
Android SDK版本: compileSdkVersion 21 buildToolsVersion "21.1.2"
这个问题并不总是存在,这让我相信它是在Android Google Play服务/地图的更新过程中引入的.
我已经在gmaps-api问题上为此打开了一个问题,但是在这篇文章中没有回复:
https://code.google.com/p/gmaps-api-issues/issues/detail?id=8455
有没有人见过这个?任何修复的想法?
编辑
我应该补充一点,我不能总是重现这一点.似乎一切都运行正常,但是当标记开始跳转时它们不会停止.
编辑2
我在Github上创建了一个较小的演示项目,使用相同的标记实现:
https://github.com/barbeau/maps-demo
但是,我还没有看到同样的问题.
编辑3
我已经改变到高速缓存Bitmaps,而不是BitmapDescriptors在https://github.com/OneBusAway/onebusaway-android/commit/01b35e9a07313a627843819d66b3f6a9bb7e848f.
我们将看看这是否解决了这个问题.这是断断续续的,所以我唯一知道的方法是,如果我在一段时间内没有再看到问题.
编辑4
我仍然看到问题,所以看起来像从缓存切换BitmapDescriptors到Bitmaps,并改为使用ContextCompat.getDrawable(),没有任何影响.
编辑5
不确定这是否相关,但是当发生这种情况时我也会在Logcat中看到以下输出:
09-01 10:46:00.339 9278-9278 /?E/libEGL:validate_display:255错误3008(EGL_BAD_DISPLAY)09-01 10:46:00.339 9278-9278 /?E/libEGL:validate_display:255错误3008(EGL_BAD_DISPLAY)
和
9-01 10:46:00.069 9278-9278 /?W/ResourcesManager:资产路径'/system/framework/com.google.android.maps.jar'不存在或不包含任何资源.
和
09-01 10:46:16.019 1137-4311 /?W/ActivityManager:在1000ms 09-01 10:46:16.019 1137-4311 /中调度崩溃服务com.google.android.gms/.usagereporting.service.UsageReportingService的重新启动 W/ActivityManager:在11000ms内调度崩溃服务com.google.android.gms/.icing.service.IndexService的重启
和
09-01 10:48:38.609 5402-26676 /?E/SQLiteDatabase:插入context_name时出错= 8 end_time = 1441118918490 context_family = 7 module_id = com.google.android.contextmanager.module.PowerConnectionModule version = 1 sync_state_mod_time_millis = 1441118918532 start_time = 1441118643058 sync_state = 0 context_id = 9680c4f4-789a-4d86-acbf- 43d2098e89b8 time_type = 3 proto_blob = [B @ 28265a3 android.database.sqlite.SQLiteConstraintException:UNIQUE约束失败:context.dcontext_id(代码2067)位于android.database.sqlite的android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method).在android.database.sqlite的android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:926)中的SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:790).
编辑6
我最近没有看到这个问题,我注意到LG G4设备上的Google Play服务受到了冲击8.1.15 (2250156-240).那么,也许它是通过更新Google Play服务来修复的?我稍后会再回来报道.
编辑7
,我再次看到了这一点8.1.15 (2250156-240),并8.1.18 (2272748-240),尽管它似乎不是几乎一样糟糕,因为它曾经是(即更少的标记跳来跳去,和跳跃不太明显).它似乎主要是在应用程序在后台运行一段时间后才会被触发.如果我杀了应用程序,然后重新开始,问题就会消失.
编辑8 我发现了一种能够始终如一地重现这一点的方法 - 请参阅:https: //code.google.com/p/gmaps-api-issues/issues/detail?id = 8455#c2
从上面的问题:
构建,安装和运行OneBusAway的v2.0.6标记:
一个.git clone https://github.com/OneBusAway/onebusaway-android.git
湾 git checkout v2.0.6
C.gradlew installObaGoogleDebug
d.adb shell am start -n com.joulespersecond.seattlebusbot/org.onebusaway.android.ui.HomeActivity
以纵向方向握住设备
- 如果您实际上并非位于西雅图或坦帕(或任何受支持的地区),则需要转到"设置 - >您所在的地区"并手动设置该地区.执行此操作后,将地图滚动到该区域(或在出现提示时选择"带我去那里").
- 点击地图上的巴士站
- 在到达时间旁边点击3个点"更多"按钮(或在滑动面板中点击到达列表)
- 点击选项"在地图上显示路线"
- 路线在地图上加载后,将设备方向更改为横向.
- 在地图重新加载后观察标记跳转
LG G4上的完整视频捕获,显示了生成和发布的新步骤:https: //youtu.be/oiBoMTPDVrU
我认为这肯定与同时存在的多个实例有关SupportMapFragment。v2.0.6当 Activity 被销毁并使用保存的实例状态重新创建时(即,当 Activity 在后台运行一段时间后或在方向更改后被终止时),我没有正确处理片段。
在 中v2.0.6,我的代码看起来像这样:
public class HomeActivity ...{
BaseMapFragment mMapFragment;
...
private void showMap() {
FragmentManager fm = getSupportFragmentManager();
if (mMapFragment == null) {
mMapFragment = BaseMapFragment.newInstance();
fm.beginTransaction()
.add(R.id.main_fragment_container, mMapFragment)
.commit();
}
}
...
}
Run Code Online (Sandbox Code Playgroud)
因此,在这些情况下,我泄漏了BaseMapFragment(extends SupportMapFragment) 的一个实例 - 中已经存在一个实例FragmentManager,但我没有对它的本地引用。当操作栏菜单项被复制到我正在处理的另一个片段时,我实际上注意到了这个问题。
我将代码更改为如下所示,它首先检查是否FragmentManager存在现有的BaseMapFragment:
public class HomeActivity ...{
BaseMapFragment mMapFragment;
...
private void showMap() {
FragmentManager fm = getSupportFragmentManager();
// First check to see if an instance of BaseMapFragment already exists
mMapFragment = (BaseMapFragment) fm.findFragmentByTag(BaseMapFragment.TAG);
if (mMapFragment == null) {
mMapFragment = BaseMapFragment.newInstance();
fm.beginTransaction()
.add(R.id.main_fragment_container, mMapFragment, BaseMapFragment.TAG)
.commit();
}
}
...
}
Run Code Online (Sandbox Code Playgroud)
主分支中的 UI 流程已更改(我不再打开新的 Activity 来查看路线),因此我无法直接测试此代码更改后问题是否仍然可重现。
然而,我创建了这个分支,它是从 master 分支出来的,但更改为具有与 v2.0.6 相同的 UI 流程,并包含上述片段泄漏修复:
https://github.com/CUTR-at-USF/onebusaway-android/tree/jumpingMarkersTest
从这个分支的一些快速测试来看,似乎在方向改变时正确处理片段(即不泄漏片段)可能已经解决了跳跃标记问题 - 至少使用上面的步骤不再在带有 Android 的 LG G4 上重现5.1.
| 归档时间: |
|
| 查看次数: |
1694 次 |
| 最近记录: |