Search code examples
androidkotlinretrofitretrofit2

When I use retrofit2, the app is just shut down


I used retrofit2 to call API. But, when I called it, my app was just shut down. There are not errors in the Logcat. I googled it, but there is not a solution. And Retrofit2 and converter-gson version is 2.9.0. I set internet permission in AndroidManifest.xml

MainActivity.kt

private fun loadMembers() {
        val retrofit = Retrofit.Builder()
            .baseUrl(MemberAPI.base_domain)
            .addConverterFactory(GsonConverterFactory.create())
            .build()

        val retrofitService = retrofit.create(MemberInterface::class.java)

        retrofitService
            .getMember(Constants.api_key)
            .enqueue(object: Callback<Member> {
                override fun onResponse(call: Call<Member>, response: Response<Member>) {
                    val members = response.body() as Member
                    var names = ""
                    for (member in members.response.body.items.item) {
                        names += "\n${member.empNm}"
                    }
                    binding.text.text = names
                }

                override fun onFailure(call: Call<Member>, t: Throwable) {
                    Toast.makeText(baseContext, "실패", Toast.LENGTH_LONG).show()
                }

            })
    }

Interface.kt

interface MemberInterface {
    @GET("{api_key}&numOfRows=5&pageNo=1&_type=json")
    fun getMember(@Path("api_key") Key: String): Call<Member>
}

Youtube Video


Solution

  • Try to add an interceptor so you can see all calls logs (headers, body, URLs, etc...). The crash could be related with the parse of the JSON response to the object Member.

    Add OkHtpp to your grade dependencies:

    implementation "com.squareup.okhttp3:okhttp:5.0.0-alpha.2"
    implementation "com.squareup.okhttp3:logging-interceptor:5.0.0-alpha.2"
    

    And after that, when you create your Retrofit instance, add the interceptor, should look something like this:

    val httpClient = OkHttpClient.Builder()
    val interceptor = HttpLoggingInterceptor()
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY)
    httpClient.addInterceptor(interceptor)
    httpClient.addInterceptor(Interceptor { chain: Interceptor.Chain ->
       val original: Request = chain.request()
       val request: Request = original.newBuilder()
            .header("Content-Type", "application/json")
            .method(original.method, original.body)
            .build()
       chain.proceed(request)
    })
          
    val okHttpClient = httpClient.build()
    val retrofit = Retrofit.Builder()
                .baseUrl(MemberAPI.base_domain)
                .client(okHttpClient)
                .addConverterFactory(GsonConverterFactory.create())
                .build()