Alex Ioja-Yang
Alex Ioja-Yang

Reputation: 1533

Unusual crash only on some device - async calls kotlin coroutines

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

Answers (1)

henrikenblom
henrikenblom

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

Related Questions