1

in my application I am trying make a requst but i have received an error. Here is my code and the exception. I check out my code I saw that the exception coming from final HttpResponse response = client.execute(request); this line. What is the problem here.

public static String getResponse(final HttpUriRequest request, final int successCode, final boolean requiresResponse)  {
        final StringBuilder sb = new StringBuilder();

        final HttpClient client = getHttpClient();
        System.out.println("getResponce4");
        try {
            final HttpResponse response = client.execute(request);
            System.out.println("getResponce5");
            final HttpEntity entity = response.getEntity();
            System.out.println("getResponce6");


            if (entity != null) {
                final InputStream stream = entity.getContent();
                byte bytes[] = new byte[4096];
                int numBytes;
                while ((numBytes=stream.read(bytes))!=-1) {
                    if (numBytes!=0) {
                        sb.append(new String(bytes, 0, numBytes));
                    }
                }
            }

            if (response.getStatusLine().getStatusCode() != successCode) {
                closeConnection(client);
                throw new Exception(sb.toString());
            }
            System.out.println("getResponce1");
            closeConnection(client);
            System.out.println("getResponce2");
            if (!requiresResponse) return null;
            System.out.println("getResponce3");

        } catch (IOException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        } catch (Exception e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
        return sb.toString();
    }

    private static void closeConnection(final HttpClient client) {
        try {
            final Method closeMethod = client.getClass().getMethod("close");
            if (closeMethod != null) {
                closeMethod.invoke(client);
            }
        }
        catch (IllegalArgumentException ignored) {}
        catch (IllegalAccessException ignored) {}
        catch (InvocationTargetException ignored) {}
        catch (SecurityException ignored) {}
        catch (NoSuchMethodException ignored) {}
    }

    private static HttpClient getHttpClient() {
        Class<?> androidClientClass;
        try {
            androidClientClass = Class.forName("android.net.http.AndroidHttpClient");
            final Method method = androidClientClass.getMethod("newInstance", String.class);

            return (HttpClient) method.invoke(null, "newInstance");

        } catch (ClassNotFoundException ignored) {}
        catch (IllegalArgumentException ignored) {}
        catch (IllegalAccessException ignored) {}
        catch (InvocationTargetException ignored) {}
        catch (SecurityException ignored) {}
        catch (NoSuchMethodException ignored) {}

        return new DefaultHttpClient();
    }

    private static String notInitialized() {
        return "{ \"errorCode\" : 101 }";
    }

    public static String getAddress(final String key1, final String key2, final String lat, final String lng) throws Exception {

        final HttpGet get = new HttpGet("http://192.168.1.4:3000/api/1.0/zoappsgeo/address/lookup");

        return getResponse(get, 200, true);
    }

exception

08-01 14:44:29.272: WARN/System.err(14718): java.lang.RuntimeException: This thread forbids HTTP requests
08-01 14:44:29.272: WARN/System.err(14718): at android.net.http.AndroidHttpClient$1.process(AndroidHttpClient.java:91)
08-01 14:44:29.272: WARN/System.err(14718): at org.apache.http.protocol.BasicHttpProcessor.process(BasicHttpProcessor.java:290)
08-01 14:44:29.272: WARN/System.err(14718): at org.apache.http.protocol.HttpRequestExecutor.preProcess(HttpRequestExecutor.java:160)
08-01 14:44:29.272: WARN/System.err(14718): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:401)
08-01 14:44:29.272: WARN/System.err(14718): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
08-01 14:44:29.272: WARN/System.err(14718): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
08-01 14:44:29.272: WARN/System.err(14718): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
08-01 14:44:29.272: WARN/System.err(14718): at android.net.http.AndroidHttpClient.execute(AndroidHttpClient.java:243)
08-01 14:44:29.272: WARN/System.err(14718): at com.ZoApps.VTGClient.getResponse(VTGClient.java:59)
08-01 14:44:29.272: WARN/System.err(14718): at com.ZoApps.VTGClient.getAddress(VTGClient.java:139)
08-01 14:44:29.272: WARN/System.err(14718): at com.ZoApps.DataActivity$1.onClick(DataActivity.java:75)
08-01 14:44:29.272: WARN/System.err(14718): at android.view.View.performClick(View.java:2532)
08-01 14:44:29.272: WARN/System.err(14718): at android.view.View$PerformClick.run(View.java:9293)
08-01 14:44:29.272: WARN/System.err(14718): at android.os.Handler.handleCallback(Handler.java:587)
08-01 14:44:29.272: WARN/System.err(14718): at android.os.Handler.dispatchMessage(Handler.java:92)
08-01 14:44:29.272: WARN/System.err(14718): at android.os.Looper.loop(Looper.java:150)
08-01 14:44:29.282: WARN/System.err(14718): at android.app.ActivityThread.main(ActivityThread.java:4277)
08-01 14:44:29.282: WARN/System.err(14718): at java.lang.reflect.Method.invokeNative(Native Method)
08-01 14:44:29.282: WARN/System.err(14718): at java.lang.reflect.Method.invoke(Method.java:507)
08-01 14:44:29.282: WARN/System.err(14718): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08-01 14:44:29.282: WARN/System.err(14718): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08-01 14:44:29.282: WARN/System.err(14718): at dalvik.system.NativeStart.main(Native Method)
  • 1
    My first thought would be that you're trying to execute this request on UI thread which is wrong because it will block your app by doing so you gotta spawn a new thread or an AsyncTask to do this stuff. Cheers. – Sergey Benner Aug 01 '12 at 11:08
  • 1
    http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception – Alexander Kulyakhtin Aug 01 '12 at 11:09

4 Answers4

2

DefaultHttpClient (from the org.apache.http.impl.client package) has been around since Android API level 1. AndroidHttpClient (from the android.net.http.AndroidHttpClient package) has only been available since Android API level 8.

Most importantly, however, is the fact that AndroidHttpClient is not allowed to execute in the main (typically GUI) application thread.

Check more at http://www.intertech.com/Blog/android-defaulthttpclientandroidhttpclient-and-httpparams/

smileface
  • 21
  • 2
1

I had this proble too. Change your

androidClientClass = Class.forName("android.net.http.AndroidHttpClient");

into

androidClientClass = Class.forName("android.net.http.DefaultHttpClient");

And it is done.

fish40
  • 5,738
  • 17
  • 50
  • 69
1

The problem is that android does not allow to send requests from the ui thread:

AndroidHttpClient:

if (Looper.myLooper() != null && Looper.myLooper() == Looper.getMainLooper() ) {
         throw new RuntimeException("This thread forbids HTTP requests");
}

You can either use the DefaultHttpClient, or AsyncTask before the request.

Check also the: http://loopj.com/android-async-http/ lib.

mspapant
  • 1,860
  • 1
  • 22
  • 31
  • This is probably the best answer, and it should be checked as accepted. The accepted one is just a workaround. – Sirio Jan 10 '15 at 11:21
0

As a quick solution replace AndroidHttpClient with DefaultHttpClient class. It is not a good solution though but shall work.

Alexander Kulyakhtin
  • 47,782
  • 38
  • 107
  • 158