마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

코루틴 api 호출 fail시 재호출

0 추천

액티비티에서 이런식으로 fail이 나면 error까지 떨어지는건 확인했는데요

lifecycleScope.launch {
    testViewModel.getTestViewModel().collect { response ->
        coroutineApiCallBack.handleApiResponse("8024", response.execute(), {
        }) { status, errorMsg ->
        }
    }
}

기존에는 코루틴 없이 baseActivity에서 

@Override
public void onFailure(Throwable t, EveryfitApi.ErrorStatus status, String message, Call<ResponseBody> call, Callback<ResponseBody> responseBodyCallback) {
    DismissProgress();
    ErrorProcess(status, message, call, responseBodyCallback, true);
}

이렇게 CallBack<ResponseBody>값을 ErrorProcess에 넘겨줘서

if (response.getCall() != null && response.getResponseBodyCallback() != null) {
    response.getCall().clone().enqueue(response.getResponseBodyCallback());
}

이렇게 api를 재호출하는 구조였는데 코루틴에는 callback이 없는데.. 이거는 어떻게 대체 해야되나요?
sandwich 라이브러리를 쓰는 방법도 있겠지만 직접 구현을 한다면 어떻게 해야되나요?
이렇게 api를 재호출하려는 이유는 데이터, 와이파이를 끈상태일때 경우입니다

수원통학러 (3,570 포인트) 님이 3월 21일 질문

1개의 답변

0 추천
근데 왜 API호출처리를 뷰에서 하고 계시나요? ViewModel 같은 곳으로 옮기시는게 여러모로 좋습니다.

콜백처리는 CallbackFlow, SuspendedCoroutine를 이용해서 처리하시면 됩니다.

https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/callback-flow.html
https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/suspend-cancellable-coroutine.html
spark (227,530 포인트) 님이 3월 21일 답변
기존 프로젝트에서 액티비티가 baseactivity를 상속 받고 있고
baceactivity에서 네트워크 연결이 끊겼을 경우에 다이얼로그를 띄우고 있습니다
그렇다보니 뷰단에서 호출하고 에러인 경우 baseactivity에 넘겨서 처리하려고 했습니다
아니면 sandwich 라이브러리를 써서 구현해봤는데
Runtry를 써서 네트워크 연결이 끊겼을때 api 재호출하도록 해봤는데 이경우엔 400번대 에러나 500에러인경우도 재호출을 하더라구요 네트워크가 끊겼을때만 retry하도록 분기하는방법이 없을까요? 문서에서 찾아봤는데 못찾아서요
Retrofit 2.6부터인가 코루틴을 지원합니다. 코루틴을 사용하실거면 이걸로 마이그레이션하시길 권장합니다.
키워드좀 알수있을까요? 그냥 2.6에서 지원할때 메소드명같은거용
Retrofit 웹사이트에 가시면
https://square.github.io/retrofit/

Kotlin Support 섹션이 있습니다.

그리고 아래 블로그 정도면 기본 사용법은 충분할 것 같습니다.
https://medium.com/android-news/kotlin-coroutines-and-retrofit-e0702d0b8e8f
...