일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- 안드로이드
- 글자 수 제한
- ellipsize
- android api호출
- 코틀린
- EditText
- maxLength
- 버튼 누르는 효과
- Kotlin
- Glide라이브러리
- XML
- Gif넣기
- Lint found fatal errors while assembling a release target
- 기본형
- compose
- 버튼 클릭 효과
- Retrofit+RxJava
- 이미지 라운딩
- retrofit
- Retrofit 2.0
- 참조형
- apk 빌드 오류
- rounding
- boxing
- 입력감지
- Android
- 글자 줄임 표시
- url에서 이미지 가져오기
- 레트로핏
- 서버 통신
- Today
- Total
단비의 개발블로그
[Android] Retrofit 2.0 사용 방법 (Java, Kotlin) - 2. Call 동기, 비동기 본문
이번 포스팅은 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 |