You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断Jetpack Compose中GoogleMap是否从缓存加载?

判断Jetpack Compose中GoogleMap是否从缓存加载并控制显示

核心思路

Google Maps SDK没有直接提供判断地图瓦片是否来自缓存的API,但可以通过网络状态监听结合地图加载状态回调间接实现需求:当设备离线且地图无法加载缓存内容时,隐藏地图组件。

具体实现步骤

1. 监听设备网络状态

使用Android的ConnectivityManager实时监听网络连接状态,判断设备是否在线。

示例代码(Compose中使用):

val context = LocalContext.current
val isOnline by remember {
    mutableStateOf(
        ConnectivityManagerCompat.getNetworkCapabilities(
            context.getSystemService(ConnectivityManager::class.java),
            context.getSystemService(ConnectivityManager::class.java).activeNetwork
        )?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) == true
    )
}

// 注册网络变化监听
DisposableEffect(Unit) {
    val connectivityManager = context.getSystemService(ConnectivityManager::class.java)
    val callback = object : ConnectivityManager.NetworkCallback() {
        override fun onCapabilitiesChanged(
            network: Network,
            networkCapabilities: NetworkCapabilities
        ) {
            isOnline = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
        }

        override fun onLost(network: Network) {
            isOnline = false
        }
    }
    connectivityManager.registerNetworkCallback(
        NetworkRequest.Builder().addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET).build(),
        callback
    )
    onDispose {
        connectivityManager.unregisterNetworkCallback(callback)
    }
}

2. 监听GoogleMap的加载状态

利用GoogleMap的onMapLoaded和onMapFailed回调,结合网络状态判断缓存是否可用:

  • 离线状态下,onMapLoaded正常回调说明缓存可用,保持地图显示;
  • 离线状态下,onMapFailed触发说明无可用缓存,隐藏地图。

示例代码:

var mapLoadedSuccessfully by remember { mutableStateOf(false) }
var shouldShowMap by remember { mutableStateOf(true) }

GoogleMap(
    modifier = if (shouldShowMap) modifier.fillMaxSize() else modifier.size(0.dp),
    cameraPositionState = cameraPositionState,
    uiSettings = uiSettings,
    onMapLoaded = {
        mapLoadedSuccessfully = true
        if (!isOnline) {
            shouldShowMap = true
        }
    },
    onMapFailed = { _ ->
        mapLoadedSuccessfully = false
        if (!isOnline) {
            shouldShowMap = false
        }
    }
)

3. 初始状态处理

应用启动时,若设备离线先默认隐藏地图,直到onMapLoaded确认缓存可用再显示:

LaunchedEffect(isOnline) {
    shouldShowMap = isOnline
}

补充说明

  • Google Maps的缓存由SDK自动管理,无法直接查询缓存内容或时长,但通过上述方式可间接判断缓存可用性;
  • 测试时需确保设备完全离线(关闭Wi-Fi和移动数据),避免网络切换导致误判;
  • 可结合Compose的SnapshotState优化状态管理,保证UI更新一致性。

内容的提问来源于stack exchange,提问作者Viks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 02:15:01