Skip to content

ANR при использовании TileProvider #420

@Elgreed

Description

@Elgreed

Крашится приложение при вызове метода load у TileProvider

internal class GeoJsonTileProvider(
    private val quadKeyRepository: QuadKeyRepository,
    private val geoJsonFactory: GeoJsonFactory,
    private val projection: Projection,
    private val mapProtocol: MapProtocol,
    private val valueVisibilityGeoJsonLayer: Int,
    context: Context
) : TileProvider {

    private val selectedMarkerId = -1

    val colorbase = ContextCompat.getColor(context, R.color.light_gray)
    val color1 = ContextCompat.getColor(context, R.color.transparent_green)
    val color2 = ContextCompat.getColor(context, R.color.transparent_yellow)
    val color3 = ContextCompat.getColor(context, R.color.transparent_crimson)

    private fun generateGeoJsonFeature(tileId: TileId, projection: Projection): ByteArray? {
        return try {
            val mapBounds = TileUtil.getRegion(projection, tileId)
            val geoJsonString = geoJsonFactory.createGeoJsonString(mapBounds, selectedMarkerId)
            println("generateGeoJsonFeature $geoJsonString")
            geoJsonString.toByteArray()
        } catch (ex: Exception) {
            println("generateGeoJsonFeature ex $ex")
            null
        }
    }

    private fun drawQuad(quadKey: QuadKey, color: Int) {
        if (mapProtocol.isDebugMode()) {
            val mapBounds = TileUtil.getRegion(projection, TileId(quadKey.x, quadKey.y, quadKey.z))
            val rect = Rect(mapBounds.minLat, mapBounds.maxLat, mapBounds.minLon, mapBounds.maxLon)
            mapProtocol.drawQuad(quadKey.toString(), rect, color)
        }
    }

    override fun load(
        tileId: TileId,
        version: Version,
        features: Map<String, String>,
        etag: String
    ): RawTile {
        val quadKey =
            QuadKey(tileId.x, tileId.y, tileId.z)
        drawQuad(quadKey, colorbase)

        val data = generateGeoJsonFeature(tileId, projection)

        val rawTile: RawTile = if (data != null && data.isNotEmpty()) {
            println("tile provider load generateGeoJsonFeature $data")
            quadKeyRepository.addQuadKey(quadKey, version.str)
            drawQuad(quadKey, color2)
            RawTile(
                version,
                features,
                quadKey.toString(),
                RawTile.UseCache.YES,
                RawTile.State.OK,
                data
            )
        } else {
            drawQuad(quadKey, color3)
            RawTile(
                version,
                features,
                etag,
                RawTile.UseCache.NO,
                RawTile.State.ERROR,
                ByteArray(0)
            )
        }
        return rawTile
    }
}

создаю tileLayer и вызываю invalidate у TileDataSource

override fun createGeoJsonLayer() {
        if (layer != null && layer?.isValid == true) return

        if (geoJsonTileProvider == null || !isGeoJsonWasAddedOnMap) {
            geoJsonTileProvider = createTileProvider(projection)
        }

        if (dataSource == null) {
            dataSource = CreateTileDataSource { tileDataSourceBuilder ->
                tileDataSourceBuilder.setTileFormat(TileFormat.GEO_JSON)
                tileDataSourceBuilder.setTileProvider(geoJsonTileProvider as TileProvider)
                tileDataSourceBuilder.setProjection(projection)
            }
        }
        val layerOptions = LayerOptions()

        layerOptions.active = true
        layerOptions.animateOnActivation = true
        layerOptions.overzoomMode = OverzoomMode.WITH_PREFETCH

        map()?.let {
            layer = it.addTileLayer(
                MAP_ITEM_LAYER_NAME,
                layerOptions,
                dataSource!!
            )
            val version = quadKeyRepository.version()
            layer?.dataSourceLayer()?.setDataSourceListener {
                (it as? TileDataSource)?.invalidate(version)
            }
            isGeoJsonWasAddedOnMap = true
        }
    }

вот rawData которая конвертируется в ByteArray:

{
  "layers": [
    {
      "type": "FeatureCollection",
      "name": "line_unknown",
      "features": [
        {
          "type": "Feature",
          "id": "parking_48629",
          "geometry": {
            "type": "LineString",
            "coordinates": [
              [
                37.70894535327568,
                55.610277444846076
              ],
              [
                37.70813245698572,
                55.61181468421711
              ]
            ]
          },
          "properties": {
            "tag": "unknown",
            "city": "msk",
            "id": "parking_48629",
            "blocked": "false"
          }
        },
        {
          "type": "Feature",
          "id": "parking_48634",
          "geometry": {
            "type": "LineString",
            "coordinates": [
              [
                37.70868349908336,
                55.61037352534835
              ],
              [
                37.707934234843066,
                55.61179151342253
              ]
            ]
          },
          "properties": {
            "tag": "unknown",
            "city": "msk",
            "id": "parking_48634",
            "blocked": "false"
          }
        }
      ]
    }
  ]
}

крашится с ошибкой

Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 15610 (YMK_3#BgHigh), pid 15140 (map.appnew)
---------------------------- PROCESS STARTED (15730) for package ru.map.appnew ----------------------------
2025-09-03 12:44:27.676 15699-15699 DEBUG                   crash_dump64                         A  Cmdline: ru.map.appnew
2025-09-03 12:44:27.676 15699-15699 DEBUG                   crash_dump64                         A  pid: 15140, tid: 15610, name: YMK_3#BgHigh  >>> ru.map.appnew <<<
2025-09-03 12:44:27.676 15699-15699 DEBUG                   crash_dump64                         A        #01 pc 00000000015ca764  /data/app/~~a9emC7ekXA6uJV_mhSp95g==/ru.map.appnew-rGnZqR5Vk7-c1nCC87b6cA==/lib/arm64/libmaps-mobile.so (BuildId: 8964493e3f69d2e2)
2025-09-03 12:44:27.676 15699-15699 DEBUG                   crash_dump64                         A        #02 pc 00000000015d2008  /data/app/~~a9emC7ekXA6uJV_mhSp95g==/ru.map.appnew-rGnZqR5Vk7-c1nCC87b6cA==/lib/arm64/libmaps-mobile.so (BuildId: 8964493e3f69d2e2)
2025-09-03 12:44:27.676 15699-15699 DEBUG                   crash_dump64                         A        #03 pc 000000000103afd0  /data/app/~~a9emC7ekXA6uJV_mhSp95g==/ru.map.appnew-rGnZqR5Vk7-c1nCC87b6cA==/lib/arm64/libmaps-mobile.so (BuildId: 8964493e3f69d2e2)
2025-09-03 12:44:27.676 15699-15699 DEBUG                   crash_dump64                         A        #04 pc 000000000103c624  /data/app/~~a9emC7ekXA6uJV_mhSp95g==/ru.map.appnew-rGnZqR5Vk7-c1nCC87b6cA==/lib/arm64/libmaps-mobile.so (BuildId: 8964493e3f69d2e2)
2025-09-03 12:44:27.676 15699-15699 DEBUG                   crash_dump64                         A        #05 pc 0000000000e702a0  /data/app/~~a9emC7ekXA6uJV_mhSp95g==/ru.map.appnew-rGnZqR5Vk7-c1nCC87b6cA==/lib/arm64/libmaps-mobile.so (BuildId: 8964493e3f69d2e2)
2025-09-03 12:44:27.676 15699-15699 DEBUG                   crash_dump64                         A        #06 pc 0000000000e74018  /data/app/~~a9emC7ekXA6uJV_mhSp95g==/ru.map.appnew-rGnZqR5Vk7-c1nCC87b6cA==/lib/arm64/libmaps-mobile.so (BuildId: 8964493e3f69d2e2)
2025-09-03 12:44:27.676 15699-15699 DEBUG                   crash_dump64                         A        #07 pc 0000000001a2a008  /data/app/~~a9emC7ekXA6uJV_mhSp95g==/ru.map.appnew-rGnZqR5Vk7-c1nCC87b6cA==/lib/arm64/libmaps-mobile.so (BuildId: 8964493e3f69d2e2)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions