В моем приложении для Android я показываю тысячи маркеров на Картах Google и кэширую BitmapDescriptor каждого маркера.
Хороший ли это подход к кэшированию BitmapDescriptor? Если да, правильно ли я делаю?
При отображении большого количества маркеров пользовательский интерфейс подтормаживает
object MarkerIconCache {
// Cache size based on typical number of unique marker types you expect
private const val CACHE_SIZE = 1000
data class MarkerKey(
val number: String,
val date: String
)
private val iconCache = object : LruCache(CACHE_SIZE) {
override fun entryRemoved(
evicted: Boolean,
key: MarkerKey,
oldValue: BitmapDescriptor,
newValue: BitmapDescriptor?
) {
// Clean up bitmap resources when removed from cache
oldValue.let {
if (it is BitmapDescriptor) {
// Optional: Release any resources if needed
}
}
}
}
fun clearCache() {
iconCache.evictAll()
}
fun getMarkerIcon(context: Context, data: MapUI): BitmapDescriptor {
// Cache key based only on color since the bitmap really only varies by color
val key = MarkerKey(
number = data.name,
date = data.Date
)
return iconCache.get(key) ?: createRectangleMarkerBitmap2(
context = context,
text = data.number,
).also {
iconCache.put(key, it)
}
}
Использование в компоновке
@Composable
fun MapMarkers(
mapViewModel: MapVM,
) {
val mapData by mapViewModel.markerData.collectAsStateWithLifecycle()
val context = LocalContext.current
//getting bitmap from cache
val markerIcons = remember(mapData) {
mapData.associateWith { data-> getMarkerIcon(context, data) }
}
//this function adjust markers if they are in same place
val adjustedMarkers = remember(mapData) { createAdjustedMarkers(mapData) }
adjustedMarkers.forEach { (data, position) ->
val markerState = MarkerState(position = position)
Marker(
state = markerState,
icon = markerIcons[data] )
}
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... in-android
Должен ли я кэшировать маркер BitmapDescriptor в Android? ⇐ Android
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение