레트로핏에 대해 질문있습니다. > QnA

본문 바로가기
사이트 내 전체검색

QnA

일반 레트로핏에 대해 질문있습니다.

페이지 정보

profile_image
작성자 segassdc1
댓글 4건 조회 49회 작성일 21-10-09 19:45

본문

댓글목록

profile_image

Scott님의 댓글

Scott 작성일

여러가지 방법이 있긴 하지만 가장 간단한 방법은 콜백 파라미터 일것 같습니다.

1. 레트로핏을 호출해주는 함수

fun getData(파라미터1:String, 콜백파라미터: ( )->Unit ) { // <- 파라미터의 타입이 ( ) -> Unit 입니다.

        서비스.api(파라미터)?.enqueue(object : Callback<반환타입?> {

            override fun onResponse(call: Call<반환타입?>, response: Response<반환타입?>) {

                콜백파라미터() // <- 여기서 함수로 부터 넘겨받은 콜백파라미터를 실행합니다.

            }

            override fun onFailure(call: Call<반환타입?>, t: Throwable) {
               
            }
        })
}

2. 해당 함수를 호출할 때 실행할 코드 블럭을 마지막에 붙혀서 보내면 onResponse 에서 호출됩니다.

getData( 값 ) {
    // 여기에 콜백파라미터에서 호출되는 코드
}

profile_image

segassdc1님의 댓글의 댓글

segassdc1 작성일

답변감사합니다. 그런데 콜백 파라미터가 약간 이해가 안가서 이렇게 다시 질문올립니다.제가 이해한게 맞다면..한 클래스내에서 콜백파라미터를 넘겨서 호출시 반환되는 구조로 이해했는데요.. 현재 구조가 A클래스에서 B(Retrofit 결과 반환하는 클래스)클래스의 값을 호출하는 형태로 되어있는데요..예를들면 코드 구조는 다음과같습니다

A클래스에서 B클래스 값(string)을 반환받고자 함..


--A클래스--
when(title)
  "English"->{
                        PapagoAPI.TranslateText(mainActivity,"ko","en",selectedText)
                        //val ret_text=  PapagoAPI.TranslateText(mainActivity,"ko","en",selectedText)이런식으로 받아오려고해요
                }
....
...
...
이런식으로 파파고API를 retrofit으로 반환하는 형태인데..B클래스에 있는 TranslateText함수를 보면

--B클래스--
{


  callPostTransferPapago.enqueue(object : retrofit2.Callback<ResultTransferPapago> {
            override fun onResponse(
                call: retrofit2.Call<ResultTransferPapago>,
                response: retrofit2.Response<ResultTransferPapago>
            ) {
                if(response.isSuccessful) {
                    val body = response.body()
                    val ret_val = body!!.message.result.translatedText
                    Toast.makeText(context, ret_val, Toast.LENGTH_LONG).show()

                }

            }
            override fun onFailure(call: retrofit2.Call<ResultTransferPapago>, t: Throwable) {

                Log.d("onFailure", t.message.toString())
            }
        })

}
이런식으로 받고있습니다.(retrofit create하는 부분은 생략했습니다.)
지금은 onResponse에 toast로 단순히 보여주고 있지만 이부분에서 B클래스의 반환하는 값(body!!.message.result.translatedText)을 반환하고 싶은데..여기서 콜백파라미터라는게 어떤건지 감이 잘안잡힙니다.


A클래스에서 필드(m_Text)를 선언후 retrofit의 OnResponse가 호출될 경우 m_Text=body!!.message.result.translatedText를 할당받는식으로 하면 될것같은데..분리가 안돼서 뭔가 보기가 더 복잡해질듯합니다..아니면 제가 잘못이해한걸까요?


만약 B클래스에서 m_text이런식으로 프로퍼티와같은것을 만들어서 할 경우 Caller(A)에서 처음엔 ""롤 반환하고 두번째 클릭해야 제대로 된 값을 반환하는데..이것때문에 조금 막히는것같습니다

*수정
이해가 잘안가서 스택오버플로우 예제를 보면서 설명을보니 retrofit이 비동기라 항상 위의구조상 함수처리가끝난후 onresponse로 처리가된다고하더군요. 그렇다는 말은 답변주신 구조가 맞다는얘긴데 그러면 위의구조에서..

Callback interface를 따로 만들어서

A클래스

PapagoAPI.TranslateText(mainActivity,"ko","en",selectedText, object:콜백함수){
..

처리
..

}

하는식이고


B 클래스
TranslateText의 파라미터에 콜백 파라미터를 추가 후

Onresponse에서 값을 콜백에 값을 할당하면 A클래스의  익명함수에 등록한 곳에 값을전달받을수 있을것같은데 이런구조로 이해하면맞을까요?

*말이 조금 이상한데 혹시 틀리다명 말씀해주세요 지금 당장 테스트하고싶은데 수리맡겨서..ㅠ.ㅠ

profile_image

Scott님의 댓글의 댓글

Scott 작성일

얼추 맞습니다

아마 파파고 클래스의 API 가 아래와 같이 생겼을 거구요

class PapagoAPI {
    fun TranslateText(context:Context, from:String, to: String, word:String, callback: () -> Unit) {
        서비스.enqueue( object : 콜백 {
            fun onResponse() {
                // 여기서 호출측에서 넘겨준 코드 블럭을 실행
                callback()
            }
        }
    }
}

코드블럭이라고 설명했지만 함수 파라미터 입니다.
실행가능한 함수를 코드로 넘겨서 받은 측에서 대신 실행해 주는거죠

profile_image

segassdc1님의 댓글의 댓글

segassdc1 작성일

감사합니다 잘되네요!

회원로그인

회원가입

Site info.

Team Flow9
Address : 10, Gukjegeumyung-ro, Yeongdeungpo-gu, Seoul, Republic of Korea
Contact : flow9.net@gmail.com

접속자집계

오늘
180
어제
282
최대
659
전체
172,241
Copyright © flow9.net All rights reserved.