2012-02-28 12 views
8

He estado trabajando en un proyecto de Android y estoy en un punto en el que quiero solicitar información sobre API. ¡Parece que esto debería ser muy básico!HttpResponse using android issue: execute always causes exception?

Aquí está la esencia general de mi código:

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; 
} 

donde la variable URL es la cadena "http://search.twitter.com/search.json?q=javacodegeeks".

Como puede ver, hay una buena información de JSON en ese sitio; Mi problema es que cada vez que se llama '' client.execute (getRequest); '', el programa lanza y captura una excepción. ¡Inútil!

He oído dos cosas:

1) Hay que establecer el permiso para el emulador/dispositivo para utilizar el Internet! - Creo que cubrí esto, ¡pero quizás lo hice mal! En el AndroidManifest.xml que añade

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

Así que hay que.

2) (de lo cual no estoy tan seguro) no puede iniciar un hilo de 'interconexión' dentro de un hilo 'ui'. No estoy del todo seguro de lo que esto significa, pero seguí y seguí un tutorial sobre Android Threads, Handlers y AsyncTasks. Aquí: Por favor, compruebe el código bajo el tutorial AsyncTask, que he seguido:

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

Después de seguir junto con el tutorial AsyncTask, descubrí que todavía tenía el mismo problema--

la línea : HttpGet httpGet = new HttpGet (url) siempre lanzó una excepción, como antes.

Aquí es el Logcat de mi intento con el tutorial roscado arriba:

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 = 


La excepción es un UnknownHostException como se puede ver:
"ava.net.UnknownHostException: No se puede resolver el host" search.twitter.com ": no hay dirección asociada con el nombre de host"
Pero no creo que el sitio es inaceptable ...

¿Puede alguien decirme lo que está pasando + lo que tengo que d o para superarlo?

+0

¿Cuáles son la excepción y el seguimiento de pila? –

+1

Agregué el logcat a la pregunta original, ya que es larga. –

+0

Añadiendo los permisos resueltos por mí. Pero, asegúrese de cambiar esta línea: '' to '' –

Respuesta

1

Creo que el problema reside en la url que usted ha dado en la petición HTTP o la conexión a Internet pls comprueban el siguiente enlace que le ayudará a Link

+0

Bueno, no creo que el problema esté en la URL, ya que cuando voy a la URL en mi comp, veo a un simpático y feo Json llenando la pantalla. Revisé ese enlace y lo intenté: System.setProperty ("http.proxyHost", android.net.Proxy.getDefaultHost()); System.setProperty ("http.proxyPort", Integer.toString (proxyPort)); Lo hice al principio de mi aplicación. Realmente no sé lo que hace, pero no resuelve el problema; –

+0

¿Podría el problema estar en mi configuración de red? –

10

descubierto. Aparentemente apagué mi AVD del "modo avión".

Para cualquiera que tenga el mismo problema que yo, probablemente esté usando la conexión inalámbrica. Por algún motivo, el andriod mira tu tarjeta LAN, así que ve a tus Conexiones de red y haz clic derecho en la tarjeta LAN. ¡DESHACERSE DE ESA COSA! Problema resuelto.

+0

¡HOMBRE! me salvaste ... Me quedé en la lógica de permisos (en tiempo de ejecución) y en la búsqueda de SO, lo que podría bloquear la llamada de API ... – bqr

10

Comprobar los permisos de su manifiesto, asegúrese de que ha añadido este:

<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"/> 
-2

puede permitir el acceso a la red en el hilo principal a través del siguiente fragmento. al comienzo de su método onCreate() de su actividad.

StrictMode.ThreadPolicy policy = new StrictMode. 
ThreadPolicy.Builder().permitAll().build(); 
StrictMode.setThreadPolicy(policy); 
+0

Realizar solicitudes de red en el hilo principal es una muy mala idea, causará retrasos en la representación de tu UI . Esto probablemente conduzca a malas críticas y 1 estrellas. –

1

Me encontré con este problema también. En mi caso, estoy usando HttpURLConnection para cargar JSON. El problema se solucionó cuando habilité "seguir redireccionamientos". Aquí hay un fragmento de código que funciona:

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()); 
      } 
     } 
    } 
Cuestiones relacionadas