Я пытаюсь вызвать API, чтобы узнать курсы обмена. Я выполнил инструкции и получил следующий код:
Задача:
class GetNetworkTask {
var client = OkHttpClient()
@Throws(IOException::class)
fun doGetRequest(url: String) {
val request: Request = Request.Builder().url(url).build()
client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
val ex = e.localizedMessage
Log.v("t", "Error: $ex")
}
override fun onResponse(call: Call, response: Response) {
val res: String? = response.body?.string()
Log.v("t", "Response: $res")
}
})
}
}
Звонок:
private fun getRates() {
val getNetworkTask = GetNetworkTask()
try {
getNetworkTask.doGetRequest("https://api.exchangeratesapi.io/latest?base=GBP")
} catch (e: IOException) {
e.printStackTrace()
}
}
Когда я пытаюсь запустить это, я получаю NetworkOnMainThreadException
, которого я не понимаю, потому что в руководстве упоминается, что это asyn c и не должно вызывать это исключение.
Любая помощь в исправлении будет очень признательна, спасибо!
К вашему сведению: я новичок в разработке Kotlin и Android, в настоящее время пытаюсь создать приложение iOS из мой для Android.
ОБНОВЛЕНИЕ:
Ошибка журнала:
2020-05-07 08:06:19.492 25998-25998/com.ets.toolbox E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.ets.toolbox, PID: 25998
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1565)
at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:115)
at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:103)
at java.net.InetAddress.getAllByName(InetAddress.java:1152)
at okhttp3.Dns$Companion$DnsSystem.lookup(Dns.kt:49)
at okhttp3.internal.connection.RouteSelector.resetNextInetSocketAddress(RouteSelector.kt:164)
at okhttp3.internal.connection.RouteSelector.nextProxy(RouteSelector.kt:129)
at okhttp3.internal.connection.RouteSelector.next(RouteSelector.kt:71)
at okhttp3.internal.connection.ExchangeFinder.findConnection(ExchangeFinder.kt:213)
at okhttp3.internal.connection.ExchangeFinder.findHealthyConnection(ExchangeFinder.kt:108)
at okhttp3.internal.connection.ExchangeFinder.find(ExchangeFinder.kt:76)
at okhttp3.internal.connection.RealCall.initExchange$okhttp(RealCall.kt:245)
at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.kt:32)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:100)
at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.kt:82)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:100)
at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.kt:83)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:100)
at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.kt:76)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:100)
at okhttp3.internal.connection.RealCall.getResponseWithInterceptorChain$okhttp(RealCall.kt:197)
at okhttp3.internal.connection.RealCall.execute(RealCall.kt:148)
at com.ets.toolbox.ui.converters.currency.CurrencyConverterFragment.getRates(CurrencyConverterFragment.kt:294)
at com.ets.toolbox.ui.converters.currency.CurrencyConverterFragment.onCreateView(CurrencyConverterFragment.kt:83)
at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2600)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:881)
at androidx.fragment.app.FragmentManagerImpl.addAddedFragments(FragmentManagerImpl.java:2100)
at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1874)
at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1830)
at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727)
at androidx.fragment.app.FragmentManagerImpl$2.run(FragmentManagerImpl.java:150)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)