我有以下改装单例:
interface MyAPI
{
@GET("/data.json")
suspend fun fetchData() : Call<MyResponse>
companion object
{
private val BASE_URL = "http://10.0.2.2:8080/"
fun create(): MyAPI
{
val gson = GsonBuilder()
.setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
.create()
val retrofit = Retrofit.Builder()
.addConverterFactory( GsonConverterFactory.create( gson ) )
.baseUrl( BASE_URL )
.build()
return retrofit.create( MyAPI::class.java )
}
}
}
MyResponse.kt
data class MyResponse(
val listOfData: List<DataEntity>
)
DataEntity.kt
data class DataEntity(
@SerializedName("name")
val fullName: String
}
我通过以下方式从ModelView调用代码:
viewModelScope.launch {
try {
val webResponse = MyAPI.create().fetchData().await()
Log.d( tag, webResponse.toString() )
}
catch ( e : Exception )
{
Log.d( tag, "Exception: " + e.message )
}
}
但我不断得到:
Unable to invoke no-args constructor for retrofit2.Call<com.host.myproject.net.response.MyResponse>. Registering an InstanceCreator with Gson for this type may fix this problem.
我似乎无法找到解决此问题的方法。
编辑:
JSON响应:
[
{
"name": "A"
},
{
"name": "B"
},
{
"name": "C"
}
]
答案 0 :(得分:2)
问题是您尝试将suspend
与返回类型Call<T>
组合在一起。使用suspend
时,应使Retrofit函数直接返回数据,如下所示:
suspend fun fetchData() : List<DataEntity> // Note: Not MyResponse, see below
那么您要做的就是在拨打电话时删除.await()
,就像这样:
// Will throw exception unless HTTP 2xx is returned
val webResponse = MyAPI.create().fetchData()
请注意,由于JSON直接返回数组,因此根本不应该使用MyResponse
类。
答案 1 :(得分:0)
第1步:删除通话并处理回复
之前:
@POST("list")
suspend fun requestList(@Body body: JsonObject): call<Profile>
之后
@POST("list")
suspend fun requestList(@Body body: JsonObject): Profile
第2步:删除暂停并处理响应
@POST("list")
fun requestList(@Body body: JsonObject): call<Profile>
答案 2 :(得分:0)
除了@Enselic的回答,
如果要获取响应(用于错误处理等),则可以返回Retrofit2的 Response
@POST("/api/news")
@CheckResult
suspend fun getNewsList(
@Body newsRequest: NewsRequest
): Response<NewsResponse>