Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- onResume
- 403 Error
- Blinking
- navigation component
- requestPermission
- shotcut
- Plugins
- LOG
- jsontokotlinclass
- datastore
- itemAnimator
- prettyJson
- webview
- skipcollapsed
- notification setting
- circlecrop
- BottomSheetDialog
- 이미지 gps
- notification
- Git
- application
- room
- Android
- onReceivedSslError
- ChromeCustomTab
- ActivityResultContracts
- ExifInterface
- notification bar
- App Startup
- kdoc-generator
Archives
- Today
- Total
Debbi Story
[Android] 네트워크 연결 감지하기! 본문
728x90
https://developer.android.com/training/basics/network-ops/reading-network-state?hl=ko
LiveData와 ConnectivityManager를 사용해 네트워크 변경을 리스너처럼 감지하는 방법입니다.
class NetworkConnection(
private val context: Context
): LiveData<Boolean>() {
private var connectivityManager: ConnectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
private lateinit var networkCallback: ConnectivityManager.NetworkCallback
override fun onActive() {
super.onActive()
updateConnection()
when {
Build.VERSION.SDK_INT >= Build.VERSION_CODES.N -> {
connectivityManager.registerDefaultNetworkCallback(connectivityManagerCallback())
}
else -> {
val request = NetworkRequest.Builder().build()
connectivityManager.registerNetworkCallback(request, connectivityManagerCallback())
}
}
}
override fun onInactive() {
super.onInactive()
connectivityManager.unregisterNetworkCallback(networkCallback)
}
private fun connectivityManagerCallback(): ConnectivityManager.NetworkCallback {
networkCallback = object : ConnectivityManager.NetworkCallback() {
override fun onLost(network: Network) {
super.onLost(network)
postValue(false)
}
override fun onUnavailable() {
super.onUnavailable()
postValue(false)
}
override fun onAvailable(network: Network) {
super.onAvailable(network)
postValue(true)
}
}
return networkCallback
}
private fun updateConnection() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
postValue(connectivityManager.isDefaultNetworkActive)
}else {
val activeNetwork: NetworkInfo? = connectivityManager.activeNetworkInfo
postValue(activeNetwork?.isConnected)
}
}
}
안드로이드 10버전 부터 NetworkInfo가 deprecated되어 분기 처리를 해주었습니다.
사용방법은 Activity에서 아래처럼 observe하면 끝입니다!
val networkConnect = NetworkConnection(context)
networkConnect.observe(this) { isConnected ->
}
또 한가지 순간적인 네트워크 상태를 가져오는 방법입니다.
val connectivityManager = context.getSystemService(ConnectivityManager::class.java)
val currentNetwork = connectivityManager.activeNetwork
currentNetwork 값이 null이면 네트워크 연결이 안 된 상태입니다.
'안드로이드 > Tip' 카테고리의 다른 글
[Android] RecyclerView blinking issue 깜박임 문제 (0) | 2021.12.08 |
---|---|
[Android] Permission 거부 처리 ActivityResultContracts (0) | 2021.11.17 |
[Android] 스크린 사이즈 구하기! (0) | 2021.11.08 |
[Android] 키보드 내리기 (0) | 2021.11.01 |
[Android] 알림 설정 이동 하기! (0) | 2021.10.28 |