문근
176
2021-07-13 23:28:36 작성 2021-07-14 09:43:33 수정됨
4
390

android retrofit2 rxjava2 response null값 재질문


제 retrofit class 입니다

private val retrofit: Retrofit = Retrofit.Builder()
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
        .addConverterFactory(GsonConverterFactory.create())
        .baseUrl(serverIp)
        .build()

    
    val userApi: UserAPI = retrofit.create(UserAPI::class.java)


data class

data class LoginRequest(
    @SerializedName("userId") val userId: String?,
    @SerializedName("userName") val userName: String?,
    @SerializedName("password") val password: String?,
    @SerializedName("phone") val phone: String?,
    @SerializedName("gender") val gender: String?,
    @SerializedName("age") val age: Int?,
    @SerializedName("email") val email: String?,
    @SerializedName("provider") val provider: String?,
    @SerializedName("pushNotiFl") val pushNotiFl: String?,
    @SerializedName("kakaoNotiFl") val kakaoNotiFl: String?,
    @SerializedName("deviceToken") val deviceToken: String?
)

api class 

@POST("user")
    fun loginBody(
        @Body loginRequest : LoginRequest
    ) : Single<UserResponse>


model 

fun loginBody(body: LoginRequest): Single<UserResponse>

model Impl

 override fun loginBody(body: LoginRequest): Single<UserResponse> {
        return RetrofitAPI.getInstance().userApi.loginBody(body)
    }

viewModel (호출부분) 

fun loginEvent(userId: String?, userName: String?, password: String?, phone: String?, gender: String?, age: Int?,
                   email: String?, provider: String?, pushNotiFl:String?, kakaoNotiFl: String?, deviceToken: String?) {

        val test: LoginRequest = LoginRequest(userId, userName, password, phone, gender, age, email, provider, pushNotiFl, kakaoNotiFl, deviceToken)
        Timber.d("Test Checked ! $test")

        addDisposable(
            model.loginBody(test)
                .subscribeOn(Schedulers.io())
                .subscribe({
                    _loginResult.postValue(it)
                }, {
                    Timber.d("response error, message : ${it.localizedMessage}")
                })
        )

    }


Login Activity

viewModel.loginResult.observe(this@LoginActivity, Observer {
if (it.status == 200){
Timber.d("Test Checked ${it.responseData.login.age}")
}else{
Timber.d("Test Checked error ${it.status} ")
}
})


포스트맨 은 정상적으로 나오는것 보아 서버는 문제 없다고 생각됩니다 





reetrofit2 호출후 status가 0을 뱉고 response가 null 만 뱉는데 어디부분을 잘못햇는지 잘 모르겠어서 질문드립니다 


구글링해보니 리턴코드가 0이면 서버에 정상적으로 연결되었다는 기사를 봤는데 바로 종료되고, 데이터가 정상적으로 입력되지 않아서 라고 하기도 합니다.

아무리 찾아도 잘 모르겠어서 질문글 올려봅니다 

일단 viewModel 쪽에서 throwable를 안뱉는거보면 서버랑 통신은 되는데 잘못된 데이터를 준거라고 생각이 됩니다 

하지만 정상적으로 데이터를 준것 같은데 이런상황이라 어디가 잘못된지 못찾겟어서요 .... 

혹시 작은 팁이라도 주시면 감사하겟습니다 

0
  • 답변 4

  • HSYE
    345
    2021-07-14 09:29:37

    response가 null 값인걸 체크한 곳이 어디인가요?

  • 문근
    176
    2021-07-14 09:43:13

    hyeonseok // 
    activity에서

     _loginResult.postValue(it)

    이부분 옵저버 받아서 Timber 찍엇습니다 내용 추가했습니다 


  • HSYE
    345
    2021-07-14 11:39:23

    이게 아닌 것 같긴한데..
    .subscribeOn(.. 밑에 .observeOn(AndroidSchedulers.mainThread()) 한번 추가해보시겠어요?

  • 문근
    176
    2021-07-14 12:37:15

    hyeonseok // 
    그대로 status가 0이뜨고 null값 리턴하네요 ㅠㅠ 그래도 감사합니다 관심주셔서 

    후아 계속 이것만보고있는데 미치겠네요 되질않으니 

  • 로그인을 하시면 답변을 등록할 수 있습니다.