无法为类调用无参数构造函数。为此类型向 Gson 注册一个 InstanceCreator 可能会解决这个问题

问题描述 投票:0回答:2
java.lang.RuntimeException: Unable to invoke no-args constructor for class com.arch.example.network.models.NetworkPagingList. Registering an InstanceCreator with Gson for this type may fix this problem.
                    at com.google.gson.internal.ConstructorConstructor$14.construct(ConstructorConstructor.java:228)
                    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:212)
                    at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:40)
                    at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:27)
                    at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:243)
                    at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:153)
                    at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:519)
                    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137)
                    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:637)
                    at java.lang.Thread.run(Thread.java:1012)
                 Caused by: java.lang.UnsupportedOperationException: Abstract class can't be instantiated! Class name: com.arch.example.network.models.NetworkPagingList
                    at com.google.gson.internal.UnsafeAllocator.assertInstantiable(UnsafeAllocator.java:120)
                    at com.google.gson.internal.UnsafeAllocator$1.newInstance(UnsafeAllocator.java:49)
                    at com.google.gson.internal.ConstructorConstructor$14.construct(ConstructorConstructor.java:225)
                    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:212) 
                    at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:40) 
                    at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:27) 
                    at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:243) 
                    at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:153) 
                    at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:519) 
                    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137) 
                    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:637) 
                    at java.lang.Thread.run(Thread.java:1012) 

实体:

import com.google.gson.annotations.SerializedName

data class NetworkPagingList<T>(
    @SerializedName("data")
    val data: List<T>
)

使用地点:

    @GET("worker/shifts")
    suspend fun getShifts(
        @Query("page") page: Int,
        @Query("perPage") perPage: Int
    ): NetworkPagingList<NetworkShift>

那么这里到底出了什么问题?

之前工作正常,但最新的 Android gradle 插件似乎停止使用发布版本,R8 的一些东西 mb

android android-gradle-plugin gson android-r8
2个回答
0
投票

尝试在您的数据类中添加

@Keep
,如下所示:

import com.google.gson.annotations.SerializedName

@Keep
data class NetworkPagingList<T>(
    @SerializedName("data")
    val data: List<T>
)

0
投票

progaurd 规则文件中的广告行可能会解决您的问题

-keepclassmembers class com.arch.example.network.models.NetworkPagingList {
    public <init>();
}
© www.soinside.com 2019 - 2024. All rights reserved.