Mobile/Android

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

luvris2 2022. 8. 24. 12:36
반응형

 

서론

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

요청 결과

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

반응형