-2

On my JSON Project, i have a little problem. My app : we get an boolean from a JSON Data (web). But the function who initialize internet doesn't want work.

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.package.mypckg/com.package.mypckg.MainActivity}: android.os.NetworkOnMainThreadException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2450)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2510)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1363)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5461)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:102)
Caused by: android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)
at java.net.InetAddress.lookupHostByName(InetAddress.java:431)
at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
at java.net.InetAddress.getAllByName(InetAddress.java:215)
at com.android.okhttp.internal.Network$1.resolveInetAddresses(Network.java:29)
at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:188)
at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:157)
at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:100)
at com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:357)
at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:340)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:330)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:248)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:437)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:388)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:231)
at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:210)
at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java)
at java.net.URL.openStream(URL.java:470)
at com.package.mypckg.MainActivity.readFromUrl(MainActivity.java:80)
at com.package.mypckg.MainActivity.checkIfOnline(MainActivity.java:63)
at com.package.mypckg.MainActivity.detectonline(MainActivity.java:47)
at com.package.mypckg.MainActivity.onCreate(MainActivity.java:39)
at android.app.Activity.performCreate(Activity.java:6251)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2403)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2510) 
at android.app.ActivityThread.-wrap11(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1363) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5461) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:102) 

This problem come from scanner = new Scanner(page.openStream());.

I didn't know why this didn't work. This is my function :

  private static String readFromUrl(String url) throws IOException {
        URL page = new URL(url);
        StringBuilder sb = new StringBuilder();
        Scanner scanner = null;
        try{
            //scanner = new Scanner(page.openStream(), StandardCharsets.UTF_8.name());
            scanner = new Scanner(page.openStream());
            while (scanner.hasNextLine()){
                sb.append(scanner.nextLine());
            }
        }finally{
            if (scanner!=null)
                scanner.close();
        }
        return sb.toString();
    }

How i can resolve it ? Thank you

General Grievance
  • 4,555
  • 31
  • 31
  • 45
PotatoesPower
  • 94
  • 1
  • 9
  • Look at this [SO Answer](http://stackoverflow.com/a/6343299/1889768) this explains what you are facing and how to overcome the issue. – Abbas Sep 02 '16 at 10:09
  • Add below line in onCreate method `StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy);` else create a AsynTask or Thread – Raghavendra Sep 02 '16 at 10:21

1 Answers1

1

Your Problem is that your are running Network on Main Thread. As UI is rendered on Main Thread android does not allow to run network related operation on main Thread. Use AsyncTask for running your network operations. You will get lot of examples of how to use asyncTask on stackoverflow iteself.

Nikhil
  • 3,711
  • 8
  • 32
  • 43