【发布时间】:2020-08-23 04:08:06
【问题描述】:
当用户在足够的延迟后(或设置了“不保留活动”开发选项)后重新进入带有 MapViewLite 组件的屏幕时会发生崩溃。它不依赖于调用代码中的任何内容——即使在 SDK 提供的“HelloMapLite”示例项目中也会发生。 这里使用的 Lite 版本:4.4.0.2.2340(但我首先在 4.3.3.0.2052 版本上发现了它)
Caused by: java.lang.RuntimeException: bad array lengths
at android.os.Parcel.readByteArray(Parcel.java:2249)
at com.here.sdk.mapviewlite.MapViewLite$SavedState.<init>(Unknown Source:8)
at com.here.sdk.mapviewlite.MapViewLite$SavedState.<init>(Unknown Source:0)
at com.here.sdk.mapviewlite.MapViewLite$SavedState$1.createFromParcel(Unknown Source:3)
at com.here.sdk.mapviewlite.MapViewLite$SavedState$1.createFromParcel(Unknown Source:0)
at android.os.Parcel.readParcelable(Parcel.java:2790)
at android.os.Parcel.readValue(Parcel.java:2684)
at android.os.Parcel.readSparseArrayInternal(Parcel.java:3134)
at android.os.Parcel.readSparseArray(Parcel.java:2367)
at android.os.Parcel.readValue(Parcel.java:2741)
at android.os.Parcel.readArrayMapInternal(Parcel.java:3053)
at android.os.BaseBundle.initializeFromParcelLocked(BaseBundle.java:288)
at android.os.BaseBundle.unparcel(BaseBundle.java:232)
at android.os.Bundle.getSparseParcelableArray(Bundle.java:1010)
at androidx.fragment.app.FragmentStateManager.restoreState(FragmentStateManager.java:236)
MapViewLite的自动反编译代码:
public Parcelable onSaveInstanceState() {
Parcelable var1 = super.onSaveInstanceState();
MapRenderer var2;
if ((var2 = this.mNativeRenderer) != null) {
MapViewLite var10000 = this;
byte[] var3 = var2.saveViewState();
byte[] var4 = var10000.getMapScene().saveLayersState();
return new MapViewLite.SavedState(var1, var3, var4);
} else {
return var1;
}
}
public void onRestoreInstanceState(Parcelable var1) {
if (var1 instanceof MapViewLite.SavedState && this.mNativeRenderer != null) {
MapViewLite var10000 = this;
MapViewLite var10001 = this;
MapViewLite.SavedState var2;
super.onRestoreInstanceState((var2 = (MapViewLite.SavedState)var1).getSuperState());
var10001.mNativeRenderer.restoreViewState(var2.getViewState());
var10000.getMapScene().restoreLayersState(var2.getLayersState());
} else {
super.onRestoreInstanceState(var1);
}
}
【问题讨论】:
-
理想情况下,当从 Parser 读取的顺序与定义类构造函数字段的顺序不同时,就会出现此错误。请注意检查您可能收到的任何警告。您能否分享一些有助于调试的示例代码。
-
它在恢复您的类 MapViewLite 时崩溃,使用您的示例代码,从 Here's page 下载的 SDK 包中的 HelloMapLite 示例项目。
-
MapViewLite 实例超过 1 个。一次只能创建一个 MapViewLite 实例。请参考在developer.here.com/documentation/android-sdk-lite/4.4.0.2/…中添加地图视图部分
-
我认为这是对我另一个问题的回答:stackoverflow.com/questions/63048997/… 是的,我之前已经阅读过该文档。但是这个要求是错误的,因为它与 Fragment 生命周期不一致。你能告诉我一个例子,如何从一个带有 Map View 的 Fragment 到另一个带有 Map View 的 Fragment 而不会发生崩溃?我不认为这是可能的,因为旧片段中的 onDestroyView 回调将在新片段中的 onViewCreated 回调之后被调用。
-
您能说出这种情况发生在哪个设备/Android 版本上吗?