Reputation: 1533
I am writing an Android App in Kotlin and I get this crash only on some HUAWEI tablet running Android API 17. However, I have tested it on a Sony Xperia and a Samsung galaxy s3 mini (or something like that), both running Android API 19 and there is no problem. The crash happens just before val data = connection.inputStream.bufferedReader().readText()
in the following code:
doAsync {
val url = urlString
val connection = URL(url).openConnection() as HttpURLConnection
val responseCode = connection.responseCode
uiThread {
if (responseCode == 200) {
// ENTERS IF AND CRASHES WITHOUT EXECUTING THE NEXT LINE
val data = connection.inputStream.bufferedReader().readText()
val response = connection.headerFields
val parser = Parser()
val stringBuilder = StringBuilder(data)
val json = parser.parse(stringBuilder) as JsonObject
}
}
}
App build.gradle
android {
compileSdkVersion 26
buildToolsVersion "26.0.0"
defaultConfig {
applicationId "appName"
minSdkVersion 17
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
The message in Logs is W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x410a3930)
without anything else before or after.
It's the first app I develop for Android, so could someone help me understand what is going on and how can I fix this crash? Is it the API 17 to blame (but there is no warning of API specific functions in app), kotlins coroutines, HUAWEI device?
Error Stack Trace as requested in comments
W/System.err: android.os.NetworkOnMainThreadException
W/System.err: at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1120)
W/System.err: at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:163)
W/System.err: at libcore.io.IoBridge.recvfrom(IoBridge.java:506)
W/System.err: at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488)
W/System.err: at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46)
W/System.err: at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240)
W/System.err: at java.io.BufferedInputStream.read(BufferedInputStream.java:304)
W/System.err: at libcore.net.http.FixedLengthInputStream.read(FixedLengthInputStream.java:45)
W/System.err: at java.io.InputStreamReader.read(InputStreamReader.java:244)
W/System.err: at java.io.BufferedReader.read(BufferedReader.java:310)
W/System.err: at java.io.Reader.read(Reader.java:145)
W/System.err: at kotlin.io.TextStreamsKt.copyTo(ReadWrite.kt:117)
W/System.err: at kotlin.io.TextStreamsKt.copyTo$default(ReadWrite.kt:114)
W/System.err: at kotlin.io.TextStreamsKt.readText(ReadWrite.kt:101)
W/System.err: at deeplake.co.uk.livedemokotlin.login$attemptLogin$1$1.invoke(login.kt:85)
W/System.err: at deeplake.co.uk.livedemokotlin.login$attemptLogin$1$1.invoke(login.kt:26)
W/System.err: at org.jetbrains.anko.AsyncKt$uiThread$1.run(Async.kt:70)
W/System.err: at android.os.Handler.handleCallback(Handler.java:725)
W/System.err: at android.os.Handler.dispatchMessage(Handler.java:92)
W/System.err: at android.os.Looper.loop(Looper.java:137)
W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5119)
W/System.err: at java.lang.reflect.Method.invokeNative(Native Method)
W/System.err: at java.lang.reflect.Method.invoke(Method.java:511)
W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:834)
W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
W/System.err: at dalvik.system.NativeStart.main(Native Method)
Upvotes: 1
Views: 1367
Reputation: 132
My guess is that you reenter the UI thread too soon as you are still doing networking operations in this call: connection.inputStream.bufferedReader().readText()
Have you tried doing this:
doAsync {
val url = urlString
val connection = URL(url).openConnection() as HttpURLConnection
val responseCode = connection.responseCode
if (responseCode == 200) {
val data = connection.inputStream.bufferedReader().readText()
val response = connection.headerFields
val parser = Parser()
val stringBuilder = StringBuilder(data)
uiThread {
val json = parser.parse(stringBuilder) as JsonObject
}
}
}
Upvotes: 1