Android(Java) - Retrofit - 동기 처리, 네트워크 응답 결과를 바로 처리하기

반응형

 

서론

레트로핏으로 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;
}

요청 결과

  • 로그캣에서 확인 결과 잘 저장되어 로그로 출력된다.

반응형