From df92bfbe4de8970085d58c8adc99353c662ac7e6 Mon Sep 17 00:00:00 2001 From: PeraSite Date: Fri, 26 Dec 2025 11:08:28 +0900 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20NetworkCallback=EC=9D=98=20onAvailab?= =?UTF-8?q?le,=20onLost=EA=B0=80=20=EB=A9=94=EC=9D=B8=20=EC=8A=A4=EB=A0=88?= =?UTF-8?q?=EB=93=9C=EC=97=90=EC=84=9C=20=EC=8B=A4=ED=96=89=EB=90=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EC=95=84=20=EB=B0=9C=EC=83=9D=ED=95=98?= =?UTF-8?q?=EB=8D=98=20=EB=AC=B8=EC=A0=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/common/NetworkConnection.kt | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/eatssu/android/presentation/common/NetworkConnection.kt b/app/src/main/java/com/eatssu/android/presentation/common/NetworkConnection.kt index af30eeae..10b5ab36 100644 --- a/app/src/main/java/com/eatssu/android/presentation/common/NetworkConnection.kt +++ b/app/src/main/java/com/eatssu/android/presentation/common/NetworkConnection.kt @@ -7,6 +7,8 @@ import android.net.ConnectivityManager import android.net.Network import android.net.NetworkCapabilities import android.net.NetworkRequest +import android.os.Handler +import android.os.Looper import android.provider.Settings import com.eatssu.android.presentation.util.showDialog @@ -21,6 +23,9 @@ class NetworkConnection(private val context: Context) : .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) // 와이파이 사용 관련 감지 .build() + // NetworkCallback은 백그라운드 스레드에서 호출되므로 Dialog 등 UI 작업은 메인 스레드에서 실행해야 함 + private val mainHandler = Handler(Looper.getMainLooper()) + // 네트워크 연결 안 되어있을 때 보여줄 다이얼로그 private val dialog: Dialog by lazy { context.showDialog("네트워크 연결 안 됨", "Wi-Fi, 모바일 데이터를 확인해주세요") { @@ -59,18 +64,23 @@ class NetworkConnection(private val context: Context) : override fun onAvailable(network: Network) { super.onAvailable(network) - if (getConnectivityStatus() == null) { - // 네트워크 연결 안 되어 있을 때 - dialog.show() - } else { - // 네트워크 연결 되어 있을 때 - dialog.dismiss() + mainHandler.post { + if (getConnectivityStatus() == null) { + // 네트워크 연결 안 되어 있을 때 + dialog.show() + } else { + // 네트워크 연결 되어 있을 때 + dialog.dismiss() + } } } // 네트워크 끊겼을 때 실행되는 메소드 override fun onLost(network: Network) { super.onLost(network) - dialog.show() + + mainHandler.post { + dialog.show() + } } } \ No newline at end of file From cb52dde5e64a38e8c41c27550db7f60086cf4ed0 Mon Sep 17 00:00:00 2001 From: PeraSite Date: Sun, 28 Dec 2025 15:15:07 +0900 Subject: [PATCH 2/2] =?UTF-8?q?refactor:=20=EC=BD=94=EB=A3=A8=ED=8B=B4?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../android/presentation/base/BaseActivity.kt | 2 +- .../presentation/common/NetworkConnection.kt | 23 +++++++++++-------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/eatssu/android/presentation/base/BaseActivity.kt b/app/src/main/java/com/eatssu/android/presentation/base/BaseActivity.kt index d92b08d6..344d452e 100644 --- a/app/src/main/java/com/eatssu/android/presentation/base/BaseActivity.kt +++ b/app/src/main/java/com/eatssu/android/presentation/base/BaseActivity.kt @@ -42,7 +42,7 @@ abstract class BaseActivity( private val networkCheck: NetworkConnection by lazy { - NetworkConnection(this) + NetworkConnection(this, lifecycleScope) } override fun onCreate(savedInstanceState: Bundle?) { diff --git a/app/src/main/java/com/eatssu/android/presentation/common/NetworkConnection.kt b/app/src/main/java/com/eatssu/android/presentation/common/NetworkConnection.kt index 10b5ab36..3a11de92 100644 --- a/app/src/main/java/com/eatssu/android/presentation/common/NetworkConnection.kt +++ b/app/src/main/java/com/eatssu/android/presentation/common/NetworkConnection.kt @@ -7,14 +7,16 @@ import android.net.ConnectivityManager import android.net.Network import android.net.NetworkCapabilities import android.net.NetworkRequest -import android.os.Handler -import android.os.Looper import android.provider.Settings +import androidx.lifecycle.LifecycleCoroutineScope +import kotlinx.coroutines.launch import com.eatssu.android.presentation.util.showDialog // 네트워크 연결 확인을 위해 네트워크 변경 시 알람에 사용하는 클래스 NetworkCallback 을 커스터마이징 -class NetworkConnection(private val context: Context) : - ConnectivityManager.NetworkCallback() { +class NetworkConnection( + private val context: Context, + private val lifecycleScope: LifecycleCoroutineScope +) : ConnectivityManager.NetworkCallback() { private val connectivityManager: ConnectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager @@ -23,9 +25,6 @@ class NetworkConnection(private val context: Context) : .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) // 와이파이 사용 관련 감지 .build() - // NetworkCallback은 백그라운드 스레드에서 호출되므로 Dialog 등 UI 작업은 메인 스레드에서 실행해야 함 - private val mainHandler = Handler(Looper.getMainLooper()) - // 네트워크 연결 안 되어있을 때 보여줄 다이얼로그 private val dialog: Dialog by lazy { context.showDialog("네트워크 연결 안 됨", "Wi-Fi, 모바일 데이터를 확인해주세요") { @@ -64,7 +63,7 @@ class NetworkConnection(private val context: Context) : override fun onAvailable(network: Network) { super.onAvailable(network) - mainHandler.post { + lifecycleScope.launch { if (getConnectivityStatus() == null) { // 네트워크 연결 안 되어 있을 때 dialog.show() @@ -79,8 +78,12 @@ class NetworkConnection(private val context: Context) : override fun onLost(network: Network) { super.onLost(network) - mainHandler.post { - dialog.show() + // Wi-Fi와 모바일 데이터가 모두 연결된 상태에서 Wi-Fi만 끊겨도 onLost가 호출될 수 있으므로, + // 현재 활성화 네트워크 여부 검증 필요 + if (getConnectivityStatus() == null) { + lifecycleScope.launch { + dialog.show() + } } } } \ No newline at end of file