E / AndroidRuntime: ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: основное и сопрограмма, Retrofit2 - PullRequest
0 голосов
/ 18 декабря 2018

Я только начал изучать kotlin, и мое первое приложение использует Retrofit2 и Coroutine, но есть проблема.У меня есть некоторые ошибки, но по Coroutine трассировки стека очень мало информации.Может быть, кто-то найдет ошибку или знает, что делать, чтобы трассировка стека стала более информативной.

ApiService:

const val API_KEY = "Bcae2032bb596c73b10bdab625c037da"

interface CurrencyApi {

//https://api.currencystack.io/currency?base=USD&target=EUR&apikey=Bcae2032bb596c73b10bdab625c037da

@GET("currency")
fun getCurrentCurrency(
    @Query("base") base: String,
    @Query("target") target: String
): Deferred<Currency>

companion object {
    operator fun invoke(): CurrencyApi {
        val requestInterceptor = Interceptor { chain ->

            val url = chain.request()
                .url()
                .newBuilder()
                .addQueryParameter("key", API_KEY)
                .build()
            val request = chain.request()
                .newBuilder()
                .url(url)
                .build()

            return@Interceptor chain.proceed(request)
        }

        val okHttpClient = OkHttpClient.Builder()
            .addInterceptor(requestInterceptor)
            .build()

        return Retrofit.Builder()
            .client(okHttpClient)
            .baseUrl("https://api.currencystack.io/")
            .addCallAdapterFactory(CoroutineCallAdapterFactory())
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(CurrencyApi::class.java)
    }
}

Активность:

 class MainActivity : AppCompatActivity(), AdapterView.OnItemSelectedListener {


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
    val model = ViewModelProviders.of(this).get(MainViewModel::class.java)

    val apiService = CurrencyApi()

    GlobalScope.launch(Dispatchers.Main) {
        val currency = apiService.getCurrentCurrency("PLN", "EUR").await()
        return@launch try {
            text_view_test.text = currency.toString()
        } catch (e: Exception) {

        }
    }

Logcat:

E / AndroidRuntime: ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: основной процесс: com.example.daniellachacz.currencyconverter, PID: 10924 retrofit2.HttpException: HTTP 400 на com.jakewharton.retrofit2.adapter.kotlin.coroutines.CapoutineFack $ $адаптировать $ 2.onResponse (CoroutineCallAdapterFactory.kt: 104) в retrofit2.OkHttpCall $ 1.onResponse (OkHttpCall.java:123) в okhttp3.RealCall $ AsyncCall.execute (RealCall.java:153) в ohntrun.Ru.java: 32) в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1113) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:588) в java.runTh.Thread.java:818)

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

Как сказал @Sergey, это ошибка сервера.

В моем случае он не может быть перехвачен API, и сервер написал: An internal server error occurred. (код 500) вместо JSON.

0 голосов
/ 08 июля 2019

Заменить @GET(currency) на @GET(currency.json)

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

Вы получите сообщение об ошибке сервера 400 Bad Request.Этот код состояния указывает, что сервер не смог понять запрос из-за неверного синтаксиса.Попробуйте отладить или поставить несколько логов и посмотреть, что вы действительно отправляете на сервер.Я думаю, что хорошее место для отладки - реализация интерфейса Interceptor.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...