簡體   English   中英

E / AndroidRuntime:致命例外:main和協程,Retrofit2

[英]E/AndroidRuntime: FATAL EXCEPTION: main and Coroutine, Retrofit2

我剛開始學習kotlin,並且我的第一個應用程序使用Retrofit2和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 at com.jakewharton.retrofit2.adapter.kotlin.coroutines.CoroutineCallAdapterFactory $ BodyCallAdapter $ adapt $ 2.outResponFactory( .kt:104),位於Retrofit2.OkHttpCall $ 1.onResponse(OkHttpCall.java:123),位於okhttp3.RealCall $ AsyncCall.execute(RealCall.java:153),位於okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)位於java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:588)的java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)位於java.lang.Thread.run(Thread.java:818)

您收到服務器錯誤400 Bad Request響應。 此狀態代碼表示服務器由於語法無效而無法理解該請求。 嘗試調試或放置一些日志,看看您真正發送到服務器的內容。 我認為調試的好地方是Interceptor接口的實現。

正如@Sergey所說,這是服務器錯誤。

就我而言,它無法被API捕獲,服務器寫道: An internal server error occurred. (代碼500)而不是JSON。

@GET(currency)替換為@GET(currency.json)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM