ArcGIS 地图在 android ViewPager2 下崩溃
ArcGIS map crashes under android ViewPager2
亲爱的 Whosebug 社区!
我的问题可能是一个菜鸟问题,我觉得我缺少一些非常基本的东西。我试图让 ArcGIS 地图在 android ViewPager2 结构下工作。地图显示得很好,但是当我导航到视图寻呼机中的另一个片段,然后返回到地图时,应用程序崩溃并出现以下异常。
com.esri.arcgisruntime.ArcGISRuntimeException: vector:
/home/jenkins/100.7.0/dev_android_java_RTCA_release/runtimecore/c_api/src/mapping/map_view/geo_view.cpp(701) : error : Exception caught in __FUNCTION__
at com.esri.arcgisruntime.internal.jni.CoreGeoView.nativeDraw(Native Method)
at com.esri.arcgisruntime.internal.jni.CoreGeoView.a(SourceFile:346)
at com.esri.arcgisruntime.internal.h.b.o.a(SourceFile:132)
at com.esri.arcgisruntime.mapping.view.MapView.onDrawFrame(SourceFile:156)
at com.esri.arcgisruntime.mapping.view.GeoView$b.onDrawFrame(SourceFile:1363)
at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1573)
at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1272)
每次调用包含 MapView 的 Fragment 的 onResume() 方法时,似乎都会发生这种情况。在此函数(即 onResume())中,我手动调用 MapView 实例上的 onResume(),如本演练所示:
https://developers.arcgis.com/labs/android/create-a-starter-app/
我将有问题的代码部分提取到测试应用程序中,删除了所有图层,现在它只是一个空应用程序中的一个空底图(在视图寻呼机结构下)并且崩溃仍然存在。
我认为这个问题可能与 ViewPager2 相关的原因是因为在以前版本的应用程序中,我使用了不同的导航结构而没有视图寻呼机并且地图工作正常。
我的实际代码与上面的演练之间的区别在于它将 MapView 直接放在 MainActivity 下,而我在使用视图寻呼机时将它放在片段中。
如果我仍然必须将适当的 onPause()、onResume()、onDestroy() 调用放在片段 class 下或主要 activity 下,我不是很清楚所以我都试过了(你可以在下面的代码中看到前者),我也试过完全删除那些覆盖函数。例外情况在每种情况下都是相同的。
这是构建视图寻呼机的测试应用 MainActivity class。
class MainActivity : AppCompatActivity() {
private lateinit var adapter: ViewPagerFragmentAdapter
private lateinit var viewPager: ViewPager2
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
adapter = ViewPagerFragmentAdapter(supportFragmentManager, lifecycle)
viewPager = findViewById(R.id.view_pager)
viewPager.adapter = adapter
}
}
和 MapFragment class。
class MapFragment: Fragment() {
lateinit var mMapView: MapView
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.fragment_map, container, false)
ArcGISRuntimeEnvironment.setLicense(resources.getString(R.string.arcgis_license_key))
mMapView = view.findViewById(R.id.map_view)
val basemapType = Basemap.Type.IMAGERY_WITH_LABELS
val latitude = 48.0166175
val longitude = 19.0339708
val levelOfDetail = 2
mMapView.map = ArcGISMap(basemapType, latitude, longitude, levelOfDetail)
return view
}
override fun onPause() {
if (mMapView != null) {
mMapView.pause()
}
super.onPause()
}
override fun onResume() {
super.onResume()
if (mMapView != null) {
mMapView.resume()
}
}
override fun onDestroy() {
if (mMapView != null) {
mMapView.dispose()
}
super.onDestroy()
}
}
你能告诉我哪里可能出错吗?
非常感谢您的提前帮助!
马克
对于遇到此类问题的任何人,请始终先检查您的依赖项:)
就我而言,ESRI 库已过时。当我从过时的依赖项切换时:
dependencies {
...
implementation 'com.esri.arcgisruntime:arcgis-android:100.7.0'
...
}
到最新的:
dependencies {
...
implementation 'com.esri.arcgisruntime:arcgis-android:100.8.0'
...
}
异常消失,应用按预期运行。
亲爱的 Whosebug 社区!
我的问题可能是一个菜鸟问题,我觉得我缺少一些非常基本的东西。我试图让 ArcGIS 地图在 android ViewPager2 结构下工作。地图显示得很好,但是当我导航到视图寻呼机中的另一个片段,然后返回到地图时,应用程序崩溃并出现以下异常。
com.esri.arcgisruntime.ArcGISRuntimeException: vector:
/home/jenkins/100.7.0/dev_android_java_RTCA_release/runtimecore/c_api/src/mapping/map_view/geo_view.cpp(701) : error : Exception caught in __FUNCTION__
at com.esri.arcgisruntime.internal.jni.CoreGeoView.nativeDraw(Native Method)
at com.esri.arcgisruntime.internal.jni.CoreGeoView.a(SourceFile:346)
at com.esri.arcgisruntime.internal.h.b.o.a(SourceFile:132)
at com.esri.arcgisruntime.mapping.view.MapView.onDrawFrame(SourceFile:156)
at com.esri.arcgisruntime.mapping.view.GeoView$b.onDrawFrame(SourceFile:1363)
at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1573)
at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1272)
每次调用包含 MapView 的 Fragment 的 onResume() 方法时,似乎都会发生这种情况。在此函数(即 onResume())中,我手动调用 MapView 实例上的 onResume(),如本演练所示:
https://developers.arcgis.com/labs/android/create-a-starter-app/
我将有问题的代码部分提取到测试应用程序中,删除了所有图层,现在它只是一个空应用程序中的一个空底图(在视图寻呼机结构下)并且崩溃仍然存在。
我认为这个问题可能与 ViewPager2 相关的原因是因为在以前版本的应用程序中,我使用了不同的导航结构而没有视图寻呼机并且地图工作正常。
我的实际代码与上面的演练之间的区别在于它将 MapView 直接放在 MainActivity 下,而我在使用视图寻呼机时将它放在片段中。
如果我仍然必须将适当的 onPause()、onResume()、onDestroy() 调用放在片段 class 下或主要 activity 下,我不是很清楚所以我都试过了(你可以在下面的代码中看到前者),我也试过完全删除那些覆盖函数。例外情况在每种情况下都是相同的。
这是构建视图寻呼机的测试应用 MainActivity class。
class MainActivity : AppCompatActivity() {
private lateinit var adapter: ViewPagerFragmentAdapter
private lateinit var viewPager: ViewPager2
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
adapter = ViewPagerFragmentAdapter(supportFragmentManager, lifecycle)
viewPager = findViewById(R.id.view_pager)
viewPager.adapter = adapter
}
}
和 MapFragment class。
class MapFragment: Fragment() {
lateinit var mMapView: MapView
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.fragment_map, container, false)
ArcGISRuntimeEnvironment.setLicense(resources.getString(R.string.arcgis_license_key))
mMapView = view.findViewById(R.id.map_view)
val basemapType = Basemap.Type.IMAGERY_WITH_LABELS
val latitude = 48.0166175
val longitude = 19.0339708
val levelOfDetail = 2
mMapView.map = ArcGISMap(basemapType, latitude, longitude, levelOfDetail)
return view
}
override fun onPause() {
if (mMapView != null) {
mMapView.pause()
}
super.onPause()
}
override fun onResume() {
super.onResume()
if (mMapView != null) {
mMapView.resume()
}
}
override fun onDestroy() {
if (mMapView != null) {
mMapView.dispose()
}
super.onDestroy()
}
}
你能告诉我哪里可能出错吗?
非常感谢您的提前帮助!
马克
对于遇到此类问题的任何人,请始终先检查您的依赖项:)
就我而言,ESRI 库已过时。当我从过时的依赖项切换时:
dependencies {
...
implementation 'com.esri.arcgisruntime:arcgis-android:100.7.0'
...
}
到最新的:
dependencies {
...
implementation 'com.esri.arcgisruntime:arcgis-android:100.8.0'
...
}
异常消失,应用按预期运行。