Невозможно вызвать конструктор без аргументов для retrofit2.Call - PullRequest
1 голос
/ 17 октября 2019

У меня есть следующий синглтон:

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"
    }
]

1 Ответ

1 голос
/ 17 октября 2019

Проблема в том, что вы пытаетесь объединить 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()

Обратите внимание, что вам вообще не следует использовать класс MyResponse, поскольку JSON возвращает массив напрямую.

...