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

코틀린) 비동기 네트워크 작업을 동기 처럼 작동하는 법

0 추천
현재 작업하는 내용에서 좀 막히는 부분이 있어서 글을 올립니다.

 

fun findPathDataReturnDocument(startPoint : LocationPoint, endPoint : LocationPoint) : Document{

    var document : Document = null

    val mapData = mapData()

    mapData.findPathDataAllType(startPoint, endPoint, object : mapData.FindPathDataAllListenerCallback{

           override fun onFIndPathDataAll(p0 : Document?){

                   document = p0

     }

})

return document!!

}

 

음... 일단 이렇게 적긴 했는데요. 시작 위치와 도착 위치를 매개변수로 넣게 되면
경로를 Document 형식으로 반환해 주는 함수 입니다.

해당 findPathDataAllType은 네트워크를 통해서 시작 위치와 도착 위치를 받아서 서버에서 경로를 반환해 줍니다.

그런데 문제는 해당 함수 안에 있는 mapData.findPathDataAllType 때문입니다. 해당 함수 안에 콜백 매개변수가 있는데
콜백 매개변수를 통해서 서버에서 경로를 받게 되는데요. 이렇게 되면 서버에서 아무래도 좀 늦게 응답을 하다보니 먼저
리턴이 실행되어서 document를 반환 받지 못 합니다.

이 부분 때문에 코루틴도 공부하고 했는데 이 부분에 어떻게 적용해야 할지를 모르겠네요.
물론 콜백 부분 안에다가 원하는 작업을 넣어도 되지만 그건 최후의 보류로 하고 현재는 경로(Document)를 반환
받고 싶습니다. 비동기로 이루어지는 Callback 작업을 순차적으로 작업이 이루어지게 할 수는 없을까요?
키리링 (840 포인트) 님이 2022년 8월 23일 질문

1개의 답변

0 추천
 
채택된 답변
코루틴도 비동기방식입니다. 다만 컴파일러를 통해서 내부적으로 콜백을 사용한 코드를 생성해주기에 동기식으로 보이느 것 뿐입니다. 따라서 비동기식 프로그래밍에 대한 개념은 가져가셔야 합니다.

mapData.FindPathDataAllListenerCallback을 그대로 사용하면서 코루틴을 적용하고 싶다면 다른 옵션들도 있지만, suspendCancellableCoroutine을 사용할 수 있습니다.

https://atoulme.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.experimental/suspend-cancellable-coroutine.html

님이 올리신 코드는 전체를 볼 수가 없기 때문에 직접 코드를 작성하시는게 좋을 것 같구요, 사용법은 코틀린문서에 나와있고 어렵지 않게 사용할 수 있을 겁니다.

https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/suspend-cancellable-coroutine.html
spark (226,420 포인트) 님이 2022년 8월 23일 답변
키리링님이 2022년 8월 23일 채택됨
위의 코드는 콜백함수를 매개변수로 받으면 코루틴없이도 사용할 수 있습니다.
...