단비의 개발블로그

[Android] Retrofit 2.0 사용 방법 (Java, Kotlin) - 2. Call 동기, 비동기 본문

Android

[Android] Retrofit 2.0 사용 방법 (Java, Kotlin) - 2. Call 동기, 비동기

단비냥 2019. 9. 3. 00:05
반응형

1. 시작하기 (이전 포스팅)

 

이번 포스팅은 Retrofit의 Call을 이용하여 실제 통신을 하는 방법에 대해서 포스팅하겠습니다.

 

많이 쓰고, 간단한 방법인것 같습니다.

동기와 비동기 통신 두가지 방법이 있습니다.

간단한 만큼 Java와 Kotlin 두가지 다 보여드릴게요

1. 초기화

[Java]

1
2
3
4
5
6
7
public static final Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://api.twitch.tv/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
 
final TwitchService twitchService = retrofit.create(TwitchService.class);
Call<ChannelData> call = twitchService.getOnlineChannel();
 

 

[Kotlin]

1
2
3
4
5
6
7
val retrofit = Retrofit.Builder()
                .baseUrl("https://api.twitch.tv/")
                .addConverterFactory(GsonConverterFactory.create())
                .build()
 
val twitchService = retrofit.create(TwitchService.class)
val call: Call<ChannelData> = twitchService.getOnlineChannel()
cs

onCreate 안에서 초기화 시켜줍니다.

 

2. 비동기 ( Asynchronous )

[Java]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 call.enqueue(new Callback<ChannelData>() {
            @Override
            public void onResponse(Call<ChannelData> call, Response<ChannelData> response) {
                if(response.body() != null){    
                    // body 가 null이 아닐 경우
                }else{
                    Log.d("Debug""body 없음");
                }
            }
 
            @Override
            public void onFailure(Call<ChannelData> call, Throwable t) {
                // 통신 중 실패했을 경우
                t.printStackTrace();
                Log.d("Debug""onFailure 실행" + t.toString());
            }
        });
r
 

Java Asynchronous

[Kotlin]

1
2
3
4
5
6
7
8
9
call.enqueue(object : Callback<ChannelData> {
      override fun onResponse(call: Call<ChannelData>, response: Response<ChannelData>) {
            Log.d("Succeed : $response")
      }
 
      override fun onFailure(call: Call<ChannelData>, t: Throwable) {
            Log.d("Failed : $t")
      }
})
 
 

 

통신 성공할 경우 onResponse, 오류가 있어 실패했을 경우 onFailure 메서드가 호출됩니다.

비동기 통신이므로 Background에서 동작하여 UI 작업( response값을 onResponse 메서드 밖에서 textview에 뿌리는 등 )을 할 경우, 통신 완료 후 onResponse 내의 작업보다 UI가 먼저 표시되어 값이 UI에 제대로 표시되지 않을 수 있습니다.

 

비동기 통신 시에는 Main Thread가 Background에서 실행되는 통신이 완료되는 것을 기다려 주지 않고 제 갈길을 가기 때문에 당연한 일이지만, 처음 비동기 통신을 구현할 때는 많이 헷갈리는 것이 사실이에요.

저 또한 몇 번의 시행착오를 통해 원하는 방식으로 구현을 할 수 있었습니다.

 

3. 동기 (Synchronous)

[Java]

1
Call<ChannelData> channelData = call.execute().body();  
 

[Kotlin]

1
val channelData = call.execute().body()
 

 

이렇게 써주시면 channelData 변수 안에 동기적으로 데이터가 들어갑니다.

하지만 Android에서는 Main Thread (UI Thread) 에서 네트워크 통신을 할 수 없습니다.

 

1
2
3
4
5
 E/AndroidRuntime: 
 FATAL EXCEPTION: main
 Process: .., PID: 1670
 
 

통신을 할 경우 이런 에러가 발생하게 됩니다.

UI Thread에서 네트워크 통신을 할 경우 통신 속도 때문에 메인 스레드가 마비될 수 있기 때문입니다.

 

그렇기 때문에 동기적으로 처리를 해주고 싶을 경우, AsyncTask를 사용하여 백그라운드 스레드에서 처리해주게 됩니다.

 

 

3. Retrofit + RxJava (다음 포스팅)

 

반응형
Comments