Android Question What is "NetworkOnMainThread..."?

boten

Active Member
Licensed User
Longtime User
I'm trying to modify an app. The app's old version works fine on all my devices (Galaxy S with froyo and GalaxyS4 JB).
now, when I re-compile (no changes yet to code) it runs OK on the emulator, on the GalaxyS, BUT on the GalaxyS4
it crashes with:
B4X:
** Activity (main) Create, isFirst = true **


** Activity (main) Resume **


android.os.NetworkOnMainThreadException


   at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1125)
   at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:163)
   at libcore.io.IoBridge.recvfrom(IoBridge.java:513)
   at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488)
   at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46)
   at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240)
   at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:103)
   at org.apache.http.impl.io.AbstractSessionInputBuffer.read(AbstractSessionInputBuffer.java:134)
   at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:174)
   at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:188)
   at org.apache.http.impl.io.ContentLengthInputStream.close(ContentLengthInputStream.java:121)
   at org.apache.http.conn.BasicManagedEntity.streamClosed(BasicManagedEntity.java:179)


   at org.apache.http.conn.EofSensorInputStream.checkClose(EofSensorInputStream.java:266)
   at org.apache.http.conn.EofSensorInputStream.close(EofSensorInputStream.java:213)
   at java.io.InputStreamReader.close(InputStreamReader.java:145)
   at org.apache.http.util.EntityUtils.toString(EntityUtils.java:139)
   at anywheresoftware.b4a.http.HttpClientWrapper$HttpResponeWrapper.GetString(HttpClientWrapper.java:489)
   at boten.jbn2.main._hc_responsesuccess(main.java:1073)
   at java.lang.reflect.Method.invokeNative(Native Method)
   at java.lang.reflect.Method.invoke(Method.java:511)
   at anywheresoftware.b4a.BA.raiseEvent2(BA.java:175)
   at anywheresoftware.b4a.BA$3.run(BA.java:320)
   at android.os.Handler.handleCallback(Handler.java:725)
   at android.os.Handler.dispatchMessage(Handler.java:92)
   at android.os.Looper.loop(Looper.java:137)
   at android.app.ActivityThread.main(ActivityThread.java:5328)
   at java.lang.reflect.Method.invokeNative(Native Method)
   at java.lang.reflect.Method.invoke(Method.java:511)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
   at dalvik.system.NativeStart.main(Native Method)
android.os.NetworkOnMainThreadException

What's wrong?

"Old" version compiled with an old version of B4A
 

boten

Active Member
Licensed User
Longtime User
Think I found the solution, though I'd like to understand why?
old version compile manifet had:
B4X:
<uses-sdk android:minSdkVersion="4" />

new version compile manifet has:
B4X:
<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="14"/>

I changed the manifest and removed the targetsdk...=14 and now it works.
Why?
 
Upvote 0

boten

Active Member
Licensed User
Longtime User
Thanks, DonManfred! I used the DisableStrictMode code (manifest with android:targetSdkVersion="14"/>) and it works.
 
Upvote 0

boten

Active Member
Licensed User
Longtime User
You should not use HttpResponse.GetString. This is a deprecated method. You should instead use HttpUtils2.
Thx. In addition of being easier, it solved the problem of some HTML pages I read are in UTF8 and some are ISO-8859-8.
HttpResponse.GetString would not let me do it twice (according to charset tag in html).
with HttpJob.Getstring2 I can examine the charset=... and do HttpJob.Getstring2 with a different parameter.
 
Upvote 0

ibonk64

Member
Licensed User
Longtime User
how to fix it without change manifest. because if android:targetSdkVersion remove. the style app change to os 2.3. tks
 
Upvote 0

jaraiza

Active Member
Licensed User
Longtime User
Just to let you know, I used an old routine I did with "hostLoad", "host_ResponseSuccess" and "host_ResponseError" to read JSON. I did because I had it, it always worked, and I was in a rush.

Now suddenly it stopped working reliable (the JSON returns a list of names to be displayed in a spinner), in a weird but consistent way. If I use a debug version, everything works ok (so I can't debug the error), but in release mode if I search for "jaime" everything works ok; if I search for "flores" then the same error is thrown:
B4X:
android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1125)
I was able to workaround the error with the info posted here (manifiest change)

Since everything else I did in the app was made with httputils2 I guess I should begin to migrate my old routine, but I wanted to help adding more details to this weird error.
 
Upvote 0
Cookies are required to use this site. You must accept them to continue using the site. Learn more…