마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

코틀린 콜백을 자바로 변환시

0 추천
fun accessTokenInfo(callback: (tokenInfo: AccessTokenInfo?, error: Throwable?) -> Unit) {
        userApi.accessTokenInfo()
            .enqueue(object : ApiCallback<AccessTokenInfo>() {
                override fun onComplete(model: AccessTokenInfo?, error: Throwable?) {
                    callback(model, error)
                }
            })
    }

 

카카오 v2로 변경작업중인데요 해당 카카오 sdk내부의 코틀린 코드입니다

이거를 자바콜백으로     
if(AuthApiClient.getInstance().hasToken()) {
          UserApiClient.getInstance().accessTokenInfo((accessTokenInfo, error) -> {

            });
        }

이렇게 받아보려고하는데 자꾸 리턴을 쓰라고하는데... 안쓰는방법이 없나요?  자바안한지 오래되서 잘모르겠네요

카카오문서에는 코틀린만 있어서 이렇게되어있습니다 코틀린에선 리턴을 안하고있는데..

자바안한지 너무 오래되서 저기 콜백을 어떻게 받아야 리턴을 안하는건지 모르겠네요

if (AuthApiClient.instance.hasToken()) {
    UserApiClient.instance.accessTokenInfo { _, error ->
        if (error != null) {
            if (error is KakaoSdkError && error.isInvalidTokenError() == true) {
                //로그인 필요
            }
            else {
                //기타 에러
            }
        }
        else {
            //토큰 유효성 체크 성공(필요 시 토큰 갱신됨)
        }
    }
}
else {
    //로그인 필요
}
수원통학러 (3,570 포인트) 님이 2023년 5월 4일 질문

1개의 답변

0 추천

코틀린의 lambda 함수는 자바에서는 인터페이스를 사용하면 됩니다.

(tokenInfo: AccessTokenInfo?, error: Throwable?) -> Unit

위의 함수는 AccessToken 타입과 Throwable 타입의 파라미터를 받아서 Unit 타입을 리턴하고 있습니다. Unit타입은 코틀린에만 존재하고 자바에서는 Void와 동일합니다. void를 사용하셔도 되는데, Void는 오브젝타입이고 null을 리턴해주어야 하지만 void는 리턴이 필요없습니다.

위의 함수 선언을 자바의 인터페이스로 만들면 아래와 같이 됩니다.

public interface AccessTokenCallback {
   void onAccessTokenComplete(@Nullable AccessTokenInfo tokenInfo, @Nullable Throwable error);
}

인터페이스의 이름과 메소드의 이름은 아무거나 주셔도 됩니다. 매개변수의 타입과 리턴타입만 잘 맞추어 주시면 됩니다.

그리고 사용하실 때는 인라인 오브젝트를 만드시면 됩니다.

UserApiClient.getInstance().accessTokenInfo(new AccessTokenCallback() {
            @Override
            public void onAccessTokenComplete(AccessTokenInfo accessTokenInfo, Throwable error) {
                  //여기에 필요한 코드
            }
        });

 

자바8 이상을 사용하신다면 인라인 인터페이스 오브젝트를 lambda expression으로 대체할 수 있습니다.

UserApiClient.getInstance().accessTokenInfo((accessTokenInfo, error) -> {
  // 여기에 코드
        });

이게 코틀린의 콜백함수와 거의 비슷한 모양입니다. 코틀린은 lamdba expression을 처음부터 지원했기 때문에 자바보다는 사용하기가 더 편합니다.

안드로이드 스튜디오를 시용하신다면 인라인 인터페이스를 오브젝트를 사용하면 람다표현식으로 바꿀 건지 물어보는 힌트가 나오니 그걸로 변환하시면 쉽습니다.

spark (226,720 포인트) 님이 2023년 5월 4일 답변
spark님이 2023년 5월 4일 수정
...