Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

HttpResponse using android issue: execute always causes exception?

I've been working on an Android project and I'm at a point where I want to ask some API for information. Seems like this should be very basic!

Here's the general gist of my code:

private InputStream retrieveStream2(String url)
{
    DefaultHttpClient client = new DefaultHttpClient();

    HttpGet getRequest = new HttpGet(url);
    System.out.println("getRequest == " + getRequest);
    try {


        HttpResponse getResponse = client.execute(getRequest);//here is teh problem
        final int statusCode = getResponse.getStatusLine().getStatusCode();


        if (statusCode != HttpStatus.SC_OK)
        {
            Log.w(getClass().getSimpleName(),
                    "Error " + statusCode + " for URL " + url);
            return null;
        }

        HttpEntity getResponseEntity = getResponse.getEntity();
        return getResponseEntity.getContent();

    }
    catch (Exception e)
    {
        getRequest.abort();
        Log.w(getClass().getSimpleName(), "Error for URL, YO " + url, e);
    }
    return null;
}

where url variable is the string "http://search.twitter.com/search.json?q=javacodegeeks".

As you can see there is some nice JSON info at that site; My problem is that every time ''client.execute(getRequest);'' is called, the program throws and catches an exception. Not useful!

I've heard two things:

1) You have to set permission for the emulator/device to use the internet! -- I think I covered this, but maybe I did it wrong! In the androidmanifest.xml I added

< uses-permission android:name="android.permission.INTERNET" >< /uses-permission>

So there's that.

2) (which I'm not so certain about) you cannot start a 'networking' thread within a 'ui' thread. I'm not entirely sure what this means, but i went ahead and followed some tutorial on Android Threads, Handlers and AsyncTasks. Here: Please check out the code under the AsyncTask tutorial, which I followed:

http://www.vogella.de/articles/AndroidPerformance/article.html

After following along with the AsyncTask tutorial, I found that I still had the same problem--

the line: HttpGet httpGet = new HttpGet(url) always threw an exception, like before.

Here is the logcat from my attempt with the threading tutorial above:

02-27 20:43:28.565: I/ActivityManager(92): START {cmp=com.Prometheus.R1/.JsonParsingActivity} from pid 574
02-27 20:43:28.565: W/WindowManager(92): Failure taking screenshot for (180x300) to layer 21010
02-27 20:43:28.896: I/System.out(574): pre execute
02-27 20:43:29.236: I/ActivityManager(92): Displayed com.Prometheus.R1/.JsonParsingActivity: +638ms
02-27 20:43:29.329: I/ARMAssembler(35): generated scanline__00000077:03010104_00008001_00000000 [ 89 ipp] (110 ins) at [0x40fad6a8:0x40fad860] in 7204915 ns
02-27 20:43:30.016: W/System.err(574): java.net.UnknownHostException: Unable to resolve host "search.twitter.com": No address associated with hostname
02-27 20:43:30.016: W/System.err(574):  at java.net.InetAddress.lookupHostByName(InetAddress.java:426)
02-27 20:43:30.026: W/System.err(574):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
02-27 20:43:30.026: W/System.err(574):  at java.net.InetAddress.getAllByName(InetAddress.java:220)
02-27 20:43:30.026: W/System.err(574):  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
02-27 20:43:30.036: W/System.err(574):  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
02-27 20:43:30.036: W/System.err(574):  at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
02-27 20:43:30.046: W/System.err(574):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
02-27 20:43:30.046: W/System.err(574):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
02-27 20:43:30.046: W/System.err(574):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
02-27 20:43:30.055: W/System.err(574):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
02-27 20:43:30.055: W/System.err(574):  at com.Prometheus.R1.JsonParsingActivity$DownloadWebPageTask.doInBackground(JsonParsingActivity.java:88)
02-27 20:43:30.055: W/System.err(574):  at com.Prometheus.R1.JsonParsingActivity$DownloadWebPageTask.doInBackground(JsonParsingActivity.java:1)
02-27 20:43:30.055: W/System.err(574):  at android.os.AsyncTask$2.call(AsyncTask.java:264)<br/>
02-27 20:43:30.066: W/System.err(574):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
02-27 20:43:30.066: W/System.err(574):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)<br/>
02-27 20:43:30.066: W/System.err(574):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
02-27 20:43:30.076: W/System.err(574):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
02-27 20:43:30.076: W/System.err(574):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
02-27 20:43:30.087: W/System.err(574):  at java.lang.Thread.run(Thread.java:856)
02-27 20:43:30.108: W/System.err(574): Caused by: libcore.io.GaiException: getaddrinfo failed: EAI_NODATA (No address associated with hostname)
02-27 20:43:30.116: W/System.err(574):  at libcore.io.Posix.getaddrinfo(Native Method)
02-27 20:43:30.116: W/System.err(574):  at libcore.io.ForwardingOs.getaddrinfo(ForwardingOs.java:55)
02-27 20:43:30.126: W/System.err(574):  at java.net.InetAddress.lookupHostByName(InetAddress.java:411)
02-27 20:43:30.126: W/System.err(574):  ... 18 more
02-27 20:43:30.136: I/System.out(574): Except thrown by url http://search.twitter.com/search.json?q=javacodegeeks, .... 
02-27 20:43:30.136: I/System.out(574): response =


The exception is an UnknownHostException as you can see:
"ava.net.UnknownHostException: Unable to resolve host "search.twitter.com": No address associated with hostname"
But I don't think the site is unacceptable...

Can anyone tell me what's going on + what I need to do to get through it?

like image 646
Ethan Sherr Avatar asked Feb 28 '12 01:02

Ethan Sherr


4 Answers

Check the permissions of your manifest, make sure you have added this:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
like image 100
Genaut Avatar answered Nov 06 '22 20:11

Genaut


Figured it out. Apparently I turned my AVD off of "airplane mode".

For anybody having the same problem as me, you're probably using wireless. For some reason the android looks at your LAN card, so go to your Network Connections and right click on the LAN card-- DISABLE THAT THING! Problem solved.

like image 27
Ethan Sherr Avatar answered Nov 06 '22 22:11

Ethan Sherr


I ran into this problem as well. In my case, I am using HttpURLConnection to load JSON. The issue was fixed when I enabled "follow redirects." Here is a code-snippet that works:

    HttpURLConnection connection = null;
    BufferedReader reader = null;
    String JSON_data = null;

    try {
        final int half_hour = 30 * 60;
        URL fetch = new URL(requestUrl);
        connection = (HttpURLConnection) fetch.openConnection();

        // FIXED: request to follow redirects - this seems to solve networking issues on older devices < API 21
        connection.setInstanceFollowRedirects(true);

        connection.setUseCaches(true);
        connection.setDefaultUseCaches(true);
        connection.setRequestMethod("GET");
        connection.addRequestProperty("Cache-Control", "max-age="+half_hour);
        connection.addRequestProperty("X-Auth-Token", getString(R.string.api_key));

        boolean redirect = false;
        int status = connection.getResponseCode();
        if (status != HttpURLConnection.HTTP_OK) {
            if (status == HttpURLConnection.HTTP_MOVED_TEMP
                    || status == HttpURLConnection.HTTP_MOVED_PERM
                    || status == HttpURLConnection.HTTP_SEE_OTHER)
                redirect = true;
        }
        Log.d(TAG, "===> HTTP STATUS CODE: " + status + ", redirect=" + redirect);

        connection.connect();

        // Read the input stream into a String
        InputStream inputStream = connection.getInputStream();
        if (inputStream == null) {
            return;
        }

        reader = new BufferedReader(new InputStreamReader(inputStream));

        StringBuilder buffer = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            buffer.append(line);
            buffer.append("\n");
        }
        if (buffer.length() == 0) {
            return;
        }
        JSON_data = buffer.toString();
        Log.d(TAG, "JSON_data=" + JSON_data);
    } catch (Exception e) {
        // possible UnknownHostException on older Android device?
        Log.e(TAG, "HttpURLConnection Exception - e=" + e.getMessage());
        e.printStackTrace();
    } finally {
        if (connection != null) {
            connection.disconnect();
        }
        if (reader != null) {
            try {
                reader.close();
            } catch (IOException e) {
                Log.e(TAG, "Error closing stream - e=" + e.getMessage());
            }
        }
    }
like image 2
Lee Hounshell Avatar answered Nov 06 '22 21:11

Lee Hounshell


I think the problem resides in the url you have given in the http request or the internet connection pls check the below link it will help you Link

like image 1
deepa Avatar answered Nov 06 '22 21:11

deepa