이번 포스팅은 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();
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) {
// 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를 사용하여 백그라운드 스레드에서 처리해주게 됩니다.
'Android' 카테고리의 다른 글
[Android] Glide 라이브러리 사용하기 (ImageView에 이미지 리소스, GIF 넣기) (0) | 2020.07.14 |
---|---|
[Android] TextWatcher 사용하기 - EditText 입력 변경 이벤트 탐지 (Kotlin) + 무한루프 해결법 (0) | 2019.09.08 |
[Android] TextView, EditText 글자 수, 줄 수 제한하기 (+글자 줄임 표시) (0) | 2019.08.08 |
[Android] Button 클릭 효과 주기 (버튼 누르는 효과, XML) (0) | 2019.08.06 |
[Android] Retrofit 2.0 사용 방법 (Kotlin) - 1. 시작하기 (0) | 2019.07.28 |