Network Monitor
Monitor stanu sieci z Flow i callbackami
馃摉 Przegl膮d
Modu艂 Network (NetworkMonitor) monitoruje stan po艂膮czenia sieciowego
i udost臋pnia go poprzez Flow oraz callbacki. Rozr贸偶nia WiFi, dane kom贸rkowe, VPN i Ethernet.
Szybki przyk艂ad
// Sprawdzenie stanu
if (ADict.Network.isOnline()) {
syncData()
}
// Obserwacja (Flow)
ADict.Network.state.collect { state ->
when (state) {
NetworkState.WIFI -> loadHighQualityContent()
NetworkState.CELLULAR -> loadLowQualityContent()
NetworkState.OFFLINE -> showOfflineMode()
}
}
// Callback na reconnect
ADict.Network.onReconnect {
syncPendingData()
}
馃搳 Stany sieci
| Stan | Opis |
|---|---|
WIFI | Po艂膮czenie Wi-Fi |
CELLULAR | Dane kom贸rkowe |
ETHERNET | Ethernet |
VPN | VPN |
OFFLINE | Brak po艂膮czenia |
UNKNOWN | Nieznany stan |
馃摎 API
isOnline(): Boolean
Czy jest po艂膮czenie z Internetem.
isWifi(): Boolean
Czy jest na Wi-Fi.
isCellular(): Boolean
Czy jest na danych kom贸rkowych.
isMetered(): Boolean
Czy po艂膮czenie jest p艂atne za dane.
getCurrentState(): NetworkState
Pobierz aktualny stan.
getNetworkInfo(): NetworkInfo
Pobierz szczeg贸艂owe informacje o sieci.
onReconnect(callback: () -> Unit)
Callback wywo艂ywany przy ponownym po艂膮czeniu.
onStateChange(callback: (NetworkState) -> Unit)
Callback wywo艂ywany przy zmianie stanu.
whenOnline(action: () -> Unit)
Wykonaj akcj臋 gdy online (lub od razu je艣li ju偶 online).
whenWifi(action: () -> Unit)
Wykonaj akcj臋 gdy na Wi-Fi.
馃摗 Flow
state: StateFlow<NetworkState>
Flow aktualnego stanu sieci.
isOnlineFlow: StateFlow<Boolean>
Flow stanu online/offline.
Obserwacja stanu
// W Activity/Fragment
lifecycleScope.launch {
ADict.Network.state.collect { state ->
updateNetworkIndicator(state)
}
}
lifecycleScope.launch {
ADict.Network.isOnlineFlow.collect { isOnline ->
offlineBanner.isVisible = !isOnline
}
}
// W ViewModel
class MainViewModel : ViewModel() {
val networkState = ADict.Network.state
.stateIn(viewModelScope, SharingStarted.Lazily, NetworkState.UNKNOWN)
}
馃挕 Przyk艂ady
Synchronizacja danych
// Sync przy reconnect
ADict.Network.onReconnect {
syncPendingChanges()
uploadQueuedPhotos()
}
// Sync tylko na WiFi
fun uploadLargeFile(file: File) {
ADict.Network.whenWifi {
uploadService.upload(file)
}
}
// Sprawdzenie przed pobieraniem
fun downloadContent(quality: Quality) {
val effectiveQuality = if (ADict.Network.isMetered()) {
Quality.LOW
} else {
quality
}
contentDownloader.download(effectiveQuality)
}
Offline mode
class MainActivity : AppCompatActivity() {
private val offlineBanner: View by lazy { findViewById(R.id.offlineBanner) }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
ADict.Network.onStateChange { state ->
offlineBanner.isVisible = state == NetworkState.OFFLINE
when (state) {
NetworkState.OFFLINE -> enableOfflineMode()
NetworkState.WIFI -> {
disableOfflineMode()
syncPendingData()
}
NetworkState.CELLULAR -> {
disableOfflineMode()
// Nie syncuj automatycznie - mo偶e by膰 drogie
}
else -> {}
}
}
}
}
馃摝 data class NetworkInfo
- stateNetworkState
- isOnlineBoolean
- isMeteredBoolean
- hasInternetBoolean
- downloadSpeedKbpsInt?
- uploadSpeedKbpsInt?