问题
I want to use
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val json = URL("https://my-api-url.com/something").readText()
simpleTextView.setText(json)
}
but this fatal error occurs
FATAL EXCEPTION: main
Process: com.mypackage.randompackage, PID: 812
java.lang.RuntimeException: Unable to start activity ComponentInfo{ ***.MainActivity}: android.os.NetworkOnMainThreadException
How can I simply read a JSON from a URL link?
The package of the async
function doesn't exist.
回答1:
Android doesn't allow accessing the internet from the main thread. The simplest way around this would be to open the URL on a background thread.
Something like this:
Executors.newSingleThreadExecutor().execute({
val json = URL("https://my-api-url.com/something").readText()
simpleTextView.post { simpleTextView.text = json }
})
Don't forget to register Internet permission in the Android Manifest file.
回答2:
You could use coroutines:
val json = async(UI) {
URL("https://my-api-url.com/something").readText()
}
Remember to add coroutines to build.gradle:
kotlin {
experimental {
coroutines "enable"
}
}
...
dependencies {
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlinx_coroutines_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlinx_coroutines_version"
...
}
Coroutines are brilliant.
来源:https://stackoverflow.com/questions/47971972/how-to-properly-use-the-url-with-kotlin-android