반응형
서론
레트로핏으로 API의 응답 결과를 변수로 받아 처리하려고하였더니 변수가 null로 뜬다.
생각해보니 여태 사용했던 방식은 비동기 방식으로 했었고 그렇기 때문에 당연한 결과였었다.
결론적으로 말하면 비동기이기 때문에 값을 바로 가용 할 수 없었던 것이고, 이 것을 동기 처리해주어야 한다.
동기 처리
- 통신에 사용할 call을 설정한다.
- 해당 콜은 구글맵API를 이용하여 내 위치 정보를 받아오는 코드이다.
Call<GoogleMapPlace> call = api.getMyLocation(
location.latitude+","+location.longitude, "ko",
Config.GOOGLE_MAPS_API_KEY);
- 쓰레드를 만들고 그 안에 API 실행 코드를 넣고 마지막에 start()로 코드를 실행한다.
- 해당 실행 코드는 내 위치를 검색하여 내가 속한 지역의 이름을 알아내는 코드이다.
// Retrofit 값을 바로 저장하기 위한 동기 처리
new Thread(new Runnable() {
@Override
public void run() {
try {
mySidoLocation = call.execute().body().getResults().get(0)
.getAddress_components().get(3).getLong_name();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
- 네트워크 통신시 응답 결과가 지연 될 수 있기 때문에 환경에 맞게 대기 시간을 설정한다.
- 주의!!! 구현시 반드시 API 응답 시간을 고려하여야 한다.
// API 응답에 따른 약간의 대기 시간 설정
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
전체 소스 코드
- 내 위치 정보(LatLng타입)를 넣어 구글맵API와 통신하고 지역 정보만을 추출하는 기능을 갖는 메소드이다.
// Google Maps API를 통한 내 현재 위치의 지역 정보 추출하는 메소드
public String getMySidoLocation(LatLng location) {
// 레트로핏, API 설정
Retrofit retrofit = NetworkClient.getRetrofitGoogleMaps(MainActivity.this);
GoogleMapGeocodeApi api = retrofit.create(GoogleMapGeocodeApi.class);
// api 요청을 위한 call 설정
Call<GoogleMapPlace> call = api.getMyLocation(
location.latitude+","+location.longitude, "ko", Config.GOOGLE_MAPS_API_KEY);
// Retrofit 값을 바로 저장하기 위한 동기 처리
new Thread(new Runnable() {
@Override
public void run() {
try {
mySidoLocation = call.execute().body().getResults().get(0).getAddress_components().get(3).getLong_name();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
// API 응답에 따른 약간의 대기 시간 설정
try {
Thread.sleep(1000);
dismissProgressBar();
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i("MyTest Location Geocode", "" + mySidoLocation );
return mySidoLocation;
}
요청 결과
- 로그캣에서 확인 결과 잘 저장되어 로그로 출력된다.
반응형