Карта ArcGIS аварийно завершает работу под Android ViewPager2

Уважаемое сообщество StackOverflow!

Мой вопрос может быть новичком, я чувствую, что упускаю что-то очень простое. Я попытался заставить карту 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)

Кажется, это происходит каждый раз, когда вызывается метод onResume() фрагмента, содержащего MapView. В этой функции (т. е. onResume()) я вручную вызываю onResume() для экземпляра MapView, как показано в этом пошаговом руководстве:

https://developers.arcgis.com/labs/android/create-a-starter-app/

Я извлек проблемную часть кода в тестовое приложение, удалил все слои, теперь это просто пустая базовая карта в пустом приложении (под структурой пейджера просмотра), и сбой сохраняется.

Причина, по которой я думаю, что эта проблема может быть связана с ViewPager2, заключается в том, что в предыдущей версии приложения я использовал другую структуру навигации без пейджера, и карта работала нормально.

Разница между моим фактическим кодом и приведенным выше пошаговым руководством заключается в том, что он помещает MapView непосредственно под MainActivity, в то время как я помещаю его во фрагмент, когда работаю с пейджером представления.

Мне было не совсем ясно, нужно ли мне по-прежнему помещать соответствующие вызовы onPause(), onResume(), onDestroy() в класс фрагмента или в основное действие, поэтому я попробовал оба (вы можете увидеть первый в коде ниже ), и я также попытался полностью удалить эти функции переопределения. Исключение было одинаковым в каждом случае.

Вот класс тестового приложения MainActivity, создающий пейджер представления.

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 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()
    }
}

Не могли бы вы указать мне, где я могу ошибиться?

Большое спасибо за любую помощь заранее!

Отметка


person Mark Szente    schedule 08.06.2020    source источник


Ответы (1)


Для тех, кто сталкивается с такими проблемами, всегда сначала проверяйте свои зависимости :)

В моем случае библиотека ESRI устарела. Когда я переключился с устаревшей зависимости:

dependencies {
    ...
    implementation 'com.esri.arcgisruntime:arcgis-android:100.7.0'
    ...
}

к последнему:

dependencies {
    ...
    implementation 'com.esri.arcgisruntime:arcgis-android:100.8.0'
    ...
}

исключение исчезло, и приложение работает как положено.

person Mark Szente    schedule 11.06.2020