안드로이드 Retrofit 네트워크 연결 실패에 따른 예외 처리

울늘·2022년 5월 31일
0

Retrofit interceptor를 통해 access토큰을 보내는 상황에 네트워크 처리를 해야한다.

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" />
profile
주니어 안드로이드 개발자입니다!

0개의 댓글