Как я могу получить данные Json от Retrofit, используя Kotlin?(Android Studio) - PullRequest
0 голосов
/ 12 декабря 2018

Пытаюсь обернуть голову вокруг дооснащения.Я новичок в этом, поэтому меня это смущает, хотя я смотрел видео и читал об этом здесь на SOЯ добавил несколько тестовых данных JSON, которые выглядят так:

[
    {"name":"John","age":30,"vehicle":"bicycle"}, 
    {"name":"Bob","age":32,"vehicle":"walking"}
]

Он был проверен и найден по этому адресу: https://api.myjson.com/bins/lnjb8

Добавлен доступ в Интернет в manifest и gradle реализации.

My interface выглядит следующим образом:

interface RetrofitCalls {

    @get:GET("lnjb8")
    val posts:Observable<List<RetrofitVariables>>
}

У меня есть класс для десериализации данных Json в constructor:

class RetrofitVariables(var name: String, var age: Int, var vehicle: String) {}

Тогда в моем основном классе мой строитель выглядит так:

var myRetrofit = Retrofit.Builder()
        .baseUrl("https://api.myjson.com/bins/")
        .addConverterFactory(GsonConverterFactory.create())
        .build()

Но отсюда я совершенно не понимаю, как получить данные Json.Итак, мои вопросы: как использовать интерфейс для отображения необработанных данных Json (с консолью все в порядке) и как десериализовать данные Json?

ОБНОВЛЕНИЕ Я добавил это: в interface:

@GET("lnjb8")
fun findPosts(): Call<List<RetrofitVariables>>

и в main классе:

var repository = myRetrofit.create(RetrofitCalls::class.java)

val jsonVariables = repository.findPosts().execute().body()

jsonVariables!!.forEach { println("TAG " + it) }

Это правильно?Он продолжает падать, и я думаю, что это связано с тем, что это синхронный вызов, а не асинхронный вызов.Я где-то видел, что можно использовать .enqueue() как в jasonVariables.enqueue(), но я не уверен, как его использовать.

1 Ответ

0 голосов
/ 12 декабря 2018

Ты на правильном пути, почти там.Теперь, когда у вас есть myRetrofit, вам нужно его использовать.Вы можете использовать его, выполнив следующее:

val repository = myRetrofit.create(RetrofitCalls::class.java)

Когда у вас есть repository, вы можете вызывать методы для него.У вас нет никаких методов в вашем интерфейсе, поэтому я не уверен, что ваша конструкция работает.Для меня работает следующее:

interface RetrofitCalls {
    @GET("lnjb8")
    fun findPosts(): Call<List<RetrofitVariables>>
}

Я использовал Call, но, вероятно, Observable работает так же хорошо, если вы хотите выполнять асинхронные вызовы.

Есливам нужна полная версия использования репозитория:

import retrofit2.Call
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.http.GET

data class RetrofitVariables(var name: String, var age: Int, var vehicle: String)

interface RetrofitCalls {
    @GET("lnjb8")
    fun findPosts(): Call<List<RetrofitVariables>>
}

var myRetrofit = Retrofit.Builder()
        .baseUrl("https://api.myjson.com/bins/")
        .addConverterFactory(GsonConverterFactory.create())
        .build()

val repository = myRetrofit.create(RetrofitCalls::class.java)

fun main(args: Array<String>) {
    val call = repository.findPosts()
    val variables = call.execute().body()

    variables?.forEach {
        println(it)
    }
}

Создает следующий вывод:

RetrofitVariables(name=John, age=30, vehicle=bicycle)
RetrofitVariables(name=Bob, age=32, vehicle=walking)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...