[Android] Retrofit의 동기/비동기 시행착오
1. Problem
위와같이 코드를 짰는데 뭔가 이상했다.
일반적인(?), 내 의도대로라면, Log가 log 1~8까지 차례대로 찍혀나가야 했는데 결과를 보니 그렇지 않았다.
아래처럼 onResponse()/onFailure() callback이 가장 나중에 call 되더라.
생각해보면 Callback method를 이용한 asynchronous한 처리이기 때문에 당연한 일이다.
한마디로 main thread는 결과를 기다리지 않고 제 갈길을 계속 가는 거다.
그런데 나는 server로부터 return되는 response값에 따라 다른 처리가 필요했기에
완전히 synchronous하게 처리해야 했다.
2. Solution
: 찾아보니까 retrofit은 동기/비동기 처리를 모두 지원한다고 한다.
(참고: retrofit2부터는 service interface에서는 둘다 Call을 return받는 것으로 바뀌어서 차이가 없고,
다른 method를 쓰도록 된 것 같다.)
그런데 android에서는 network처리를 '작업 thread'에서만 처리할 수 있도록 예전에 바뀌었기 때문에
동기식으로 처리한다고 해도, 또 다른 thread에서 돌려야 했고, 내가 원하는 타이밍에 network처리를 하고,
그 결과 값을 return받아서 사용하는 건 똑같이 순서가 뒤죽박죽이었다.
(비동기처리와 마찬가지로)
그래서 내린 결론은 임의로 타이밍을 맞춰주는 것이다.
그래서 Thread.sleep(1000);으로 1초를 기다리고 처리를 했더니,
그동안 network처리 시간이 충분했는지, return값을 받고, 내가 원하는 방향으로 처리할 수 있었다.
3. 느낀점 / 배운점
: 내가 원하는대로 구현은 가능했지만, 실제로 현업에서도 login을 이런식으로 network를 구현하는지는 알아봐야 할 일이며, retrofit이 빠르고 편리하지만, 무조건 장점만 있는 건 또 아닌것 같다.