Android Kotlin модифицирует сопрограммы запросы с ошибкой Моши - PullRequest
0 голосов
/ 21 сентября 2019

В настоящее время я работаю над некоторым базовым приложением, которое пытаюсь получить ответ от API - Список объектов.

Мои классы данных:

@JsonClass(generateAdapter = true)
data class Tag(
    @Json(name = "id")
    val id: Int,
    @Json(name = "name")
    val name: String
)

@JsonClass(generateAdapter = true)
data class Test(
    @Json(name = "count")
    val count: Int,
    @Json(name = "next")
    val next: Int,
    @Json(name = "previous")
    val previous: Int,
    @Json(name = "results")
    val results: List<Tag>
)

Мой модифицированный код сборкиэто:

val moshi = Moshi.Builder()
    .add(KotlinJsonAdapterFactory())
    .build()

return Retrofit.Builder()
    .baseUrl(SERVER_BASE_URL)
    .addCallAdapterFactory(CoroutineCallAdapterFactory())
    .addConverterFactory(MoshiConverterFactory.create(moshi))
    .build()

И мой запрос очень прост:

@GET("api/tags")
suspend fun getTags(): Deferred<Test>

Но когда я звоню getTags(), я получаю следующую ошибку:

java.lang.IllegalArgumentException: Unable to create converter for kotlinx.coroutines.Deferred<com.example.kotlin_ex2.models.Test>
     Caused by: java.lang.IllegalArgumentException: No JsonAdapter for kotlinx.coroutines.Deferred<com.example.kotlin_ex2.models.Test> (with no annotations)

Уже пробовал много других способов безуспешно, в чем может быть проблема?

Спасибо

Ответы [ 2 ]

1 голос
/ 21 сентября 2019

Это потому, что вы используете suspend в интерфейсе.Конвертировать

@GET("api/tags")
suspend fun getTags(): Deferred<Test>

в

@GET("api/tags")
fun getTags(): Deferred<Test>
0 голосов
/ 21 сентября 2019

решаемая.Как я вижу, мне просто нужно было удалить класс Deferred и написать его так:

@GET("api/tags")
suspend fun getTags(): Test

и нет необходимости вызывать await() изнутри Coroutine.

...