Kotlin,Retrofit,ClassCastException,com.google.gson.internal.LinkedTreeMap不能强制转换为List< CatListItem>?

avkwfej4  于 2023-04-30  发布在  Kotlin
关注(0)|答案(1)|浏览(217)

我的界面

interface ApiService {
    @GET("URL")
    fun getCatList(
        @Query("var1") var1: String,
        @Query("var2") var2: String,
    ): Call<List<CatListItem>?>
}

我的助手

class ApiClient {
    companion object {
        private lateinit var retrofit: Retrofit

        fun getClient(): Retrofit {
            val interceptor = HttpLoggingInterceptor()
            interceptor.level = HttpLoggingInterceptor.Level.BODY

            val client = OkHttpClient.Builder().addInterceptor(interceptor).build()

            retrofit = Retrofit.Builder()
                .baseUrl(ApiConstants.baseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .client(client)
                .build()

            return retrofit
        }
    }
}

我的API

override fun getCatList(var1: String, var2: String) {
        val apiInterface: ApiService = ApiClient.getClient().create(ApiService::class.java)

        val call = apiInterface.getCatList(var1, var2)

        call.enqueue(object : Callback<List<CatListItem>?> {
            override fun onResponse(
                call: Call<List<CatListItem>?>, response: Response<List<CatListItem>?>
            ) {
                if (response.isSuccessful) {
                    val answer = CatList(response.body())
                    return
                }
            }

            override fun onFailure(call: Call<List<CatListItem>?>, t: Throwable) {
                call.cancel()
            }
        })
    }

我的数据类

data class CatList(

    @field:SerializedName("catList")
    val catList: List<CatListItem?>? = null
)

data class CatListItem(

    @field:SerializedName("name")
    val name: String? = null,
)

我的JSON

[{"name":"1"},{"name":"2"}]

我的ProGuard规则

-keep,allowobfuscation,allowshrinking interface retrofit2.Call
-keep,allowobfuscation,allowshrinking class retrofit2.Response
-keep,allowobfuscation,allowshrinking class retrofit2.*
-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation

-keep class com.google.gson.** { *; }
-keep class com.google.gson.reflect.** { *; }
-keep class com.google.gson.stream.** { *; }
-keep class com.google.gson.internal.** { *; }

-keep class * implements java.io.Serializable { *; }

-keepclassmembers class * {
    @com.google.gson.annotations.SerializedName <fields>;
}

-keepclassmembers enum * {
    *;
}

在发布模式下登录,除发布模式外,在调试模式下一切正常

java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to q2.a
                                                                                                        at o2.c.run(Unknown Source:385)
                                                                                                        at java.util.TimerThread.mainLoop(Timer.java:562)
                                                                                                        at java.util.TimerThread.run(Timer.java:512)

问题出在APK发布模式下,在调试模式下一切正常。
我改变了暂停,但什么都没变。还测试了一个runBlocking与暂停的乐趣在接口,没有什么变化。好像少了什么东西。我猜这是在内部处理名单时发生的?
我需要你的帮助来解决这个问题。提前感谢您的支持。

oug3syen

oug3syen1#

好的,谢谢你的回答。
我的问题的解决方案是:- 评论我的有趣getCatList(var 1:字符串,变量2:String). -编译释放。- 然后取消注解我的函数。- 然后重新编译
我不知道为什么这是解决这个问题的方法。
但对我很有效。
如果有人能告诉我为什么这一点,将帮助我了解,如果在这个项目中错过了什么。
待会再说

相关问题