private class NetworkInterceptor : Interceptor {
@Throws(IOException::class)
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request()
return try {
chain.proceed(
request.newBuilder()
.addHeader("AUTHORIZATION", PrefsManager.accessToken)
.build()
)
} catch (e: Exception) {
Response.Builder()
.request(request)
.protocol(Protocol.HTTP_1_1)
.code(NETWORK_ERROR)
.message(e.message ?: "")
.body(ResponseBody.create(null, e.message ?: ""))
.build()
}
}
}
preference를 통해 로컬DB에서 access토큰을 헤더에 담아 보내는 과정에서 에러가 발생했을 경우 Builder를 새로 빌드하여 response값을 다시 보내주어야한다.
이후 layout에 viewbinding을 통해 네트워크 관련 뷰 작업이나 뷰모델 작업을 하여 네트워크 끊겼을 때의 화면을 뷰에 띄우도록한다.
현재 작업 중인 프로젝트에서 가져온 예시이다.
뷰모델
viewModelScope.launch {
Repository.getHouseWorkList()
.runCatching {
collect {
_chorepreset.value = it.preset
}
}.onFailure {
_networkError.value = true
}
뷰
lifecycleScope.launchWhenCreated {
viewModel.networkError.collect {
binding.isConnectedNetwork = it
}
}
레이아웃
<variable
name="isConnectedNetwork"
type="boolean" />
<include
android:id="@+id/layoutNetwork"
layout="@layout/layout_disconnected_network"
android:layout_width="0dp"
android:layout_height="match_parent"
android:visibility="@{isConnectedNetwork ? View.VISIBLE : View.GONE}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />