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

안드로이드 네이버 로그인 rxjava background 사용하기

0 추천

안녕하세요 

저는 안드로이드 네이버 로그인후 정보 받아오기 를 하려고하는데 구글에 아무리 검색해봐도

rx로 된 예제가 없고 가장 최근글도 AsyncTask로 구현하신 글들 뿐이더라고요 

그래서 제가 공부해서 구현을 하려고 이것저것 해봤는데 잘안되서 질문드립니다 .

코드는 아래와 같습니다 

하지만 retrun type가 String 으로만 되있어서 이부분을 어떻게 해야될지 잘 모르겠습니다 

String으로 받은걸 파싱해서 다시 json으로 재조합다음에 response로 줘야되는건가요? 

어떻게해야할지 잘 모르겠습니다 도움주시면 감사하겠습니다 

data class naverLogin(
    var id: String?,
    var age: String?,
    var gender: String?,
    var email: String?,
    var mobile: String?,
    var name: String?,
    var birthyear: String?,
)
fun naverLogin(mOAuthLoginModule: OAuthLogin, context: Context, token: String, url: String): Single<UserResponse>
override fun naverLogin(mOAuthLoginModule: OAuthLogin, context: Context, token: String, url: String): Single<UserResponse> {
    return mOAuthLoginModule.requestApi(context, token, url)
}
fun naverLogin(mOAuthLoginModule: OAuthLogin, mContext: Context) {
    val url = "https://openapi.naver.com/v1/nid/me"
    val at = mOAuthLoginModule.getAccessToken(mContext)

    addDisposable(
        model.naverLogin(mOAuthLoginModule, mContext,  at, url)
            .subscribeOn(Schedulers.io())
            .subscribe({
                _loginResult.postValue(it)
            }, {
                Timber.d("response error, message : ${it.localizedMessage}")
            })
    )
}
공과근성 (5,980 포인트) 님이 3일 질문

1개의 답변

0 추천

mOAuthLoginModule.requestApi(context, token, url)가 String를 리턴한다는 말씀이시죠?  Sychronous 콜이라고 가정하면,
Single.just랑 Kotlin extension function을 조합해서 이렇게 해볼 수 있을 것 같습니다.

inline fun <reified T> AuthLoginModule.sendRequest(context: Context, token: String, url: String) : T {
    val responseStr = this.requestApi(contet, token, url);
    return Gson().deserialize(responseStr)
}


inline fun <reified T> Gson.deserialize(json: String) = fromJson<T>(json, object: TypeToken<T>() {}.type)

이렇게 하실 수도 있고 아니면 wrapper.클래스를 만드셔도 될 것 같습니다.

class NaverApi (
    private val context: Context,
    private val oAuthModule: OAuthModule,
    private val tokenProvider: TokenProvider,
    private val gson: Gson
) {
      fun <T> sendRequest(url: String): T {
            ...    
      }
}

     

 

추가적으로  Kotlin을 사용하신다면 RxJava보다는 Coroutine이 좀 더 적합한 선택일 것 같습니다.

selaed class NaverLoginResult {
    data class Error(e: Throwable): NaverLoginResult()
    data class Success(data: NaverLogin): NaverLoginResult()
}

class NaverLoginApi (
   private val authLoginModule: AuthLoginModule,
   private val context: Context,
   private val gson: Gson,
) {

suspend fun getAccessToken(): String {
      authLoginModule.getAccessToken();    
}

suspend fun login(): NaverLoginResult {
     val url = ...
     return try {
         val accessToken = getAccessToken()
         val responseStr = authLoginModule.requestApi(context, url)
         NaverLoginResult.Success(gson.deserialize(responseStr))
     } catch (e: Exception) {
         NaverLoginResult.Error(e)
    }
}

 

spark (66,020 포인트) 님이 2일 답변
spark님이 2일 수정
...