0

I need to send a HTTP post request and receive the output but when I run the app the app crashes.

Below is the code I use.

public String getRequest(String url) { StringBuilder responseOutput = new StringBuilder();

try {
        URL uri = new URL(url);
        HttpURLConnection connection = (HttpURLConnection)uri.openConnection();

        connection.setRequestMethod("POST");
        connection.setRequestProperty("USER-AGENT", "Mozilla/5.0");
        connection.setRequestProperty("ACCEPT-LANGUAGE", "en-US,en;0.5");
        connection.setDoOutput(true);

        DataOutputStream dStream = new DataOutputStream(connection.getOutputStream());
        dStream.flush();
        dStream.close();

        BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));

        String line = "";

        while((line = br.readLine()) != null ) {
            responseOutput.append(line);
        }
        br.close();

    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return responseOutput.toString();
}

This is the crash log.

05-18 16:34:50.915 18272-18272/com.prisonvoicemail.appupdater E/AndroidRuntime: 
FATAL EXCEPTION: main

  Process: com.prisonvoicemail.appupdater, PID: 18272

  java.lang.RuntimeException: Unable to start activity ComponentInfo{com.prisonvoicemail.appupdater/com.prisonvoicemail.appupdater.MainActivity}: android.os.NetworkOnMainThreadException

  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2426)

  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490)

  at android.app.ActivityThread.-wrap11(ActivityThread.java)

  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354)

  at android.os.Handler.dispatchMessage(Handler.java:102)

  at android.os.Looper.loop(Looper.java:148)

  at android.app.ActivityThread.main(ActivityThread.java:5443)

  at java.lang.reflect.Method.invoke(Native Method)

  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)

  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

    Caused by: android.os.NetworkOnMainThreadException

  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1287)

  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.connect(HttpURLConnectionImpl.java:114)

  at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:245)

  at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getOutputStream(DelegatingHttpsURLConnection.java:218)

  at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java)

  at com.prisonvoicemail.appupdater.HTTPRequest.getRequest(HTTPRequest.java:72)

  at com.prisonvoicemail.appupdater.MainActivity.onCreate(MainActivity.java:79)

  at android.app.Activity.performCreate(Activity.java:6259)

  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1130)

  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379)

  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490) 

  at android.app.ActivityThread.-wrap11(ActivityThread.java) 

  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354) 

  at android.os.Handler.dispatchMessage(Handler.java:102) 

  at android.os.Looper.loop(Looper.java:148) 

  at android.app.ActivityThread.main(ActivityThread.java:5443) 

  at java.lang.reflect.Method.invoke(Native Method) 

  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) 

  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
DopeAt
  • 451
  • 3
  • 15
Declan Marks
  • 65
  • 1
  • 8
  • Possible duplicate of [android os network on main thread exception](http://stackoverflow.com/questions/17365646/android-os-network-on-main-thread-exception) – yanivtwin May 18 '17 at 16:07

2 Answers2

0

Android doens't allow network calls on main thread(which controls the ui) in order to keep him free , you need to do some easy multithreading , you can take a look at Asynctask for that operation , or use an outside library such as Retrofit , Volley , Loopj etc...

You can start with Asynctask for a first lesson:

http://developer.android.com/reference/android/os/AsyncTask.html

put the code of the call in doinbackground ( another thread and not the main thread ) , after getting your result and finishing the doinbackground you'll get to OnPost method (is on the main thread , you can make ui changes here)

Hope it helps.

yanivtwin
  • 617
  • 8
  • 32
0

You are having NetworkOnMainThreadException, this is because you are calling this method from application main thread.

You should not do any network operation (blocking operation) in the main thread, this will stuck your application until the operation is finished. Besides, wrap the function call inside an AsyncTask then call AsyncTask.execute() this will fix your issue. e.g

AsyncTask task = new AsyncTask() {
    @Override
    protected Object doInBackground(Object[] params) {
        //do your stuff here
        return null;
    }
};
task.execute();

Hope that helps. cheers :)

Abu Faisal
  • 398
  • 3
  • 12