2012-02-28 1 views
8

Я работаю над проектом Android, и я нахожусь в точке, где я хочу спросить некоторый API для информации. Похоже, это должно быть очень просто!HttpResponse с использованием проблемы Android: выполнение всегда вызывает исключение?

Вот общая суть моего кода:

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

где переменная URL является строка "http://search.twitter.com/search.json?q=javacodegeeks".

Как вы можете видеть, на этом сайте есть какая-то приятная информация JSON; Моя проблема в том, что каждый раз вызывается «client.execute (getRequest);», программа бросает и ловит исключение. Не полезно!

Я слышал две вещи:

1) Вы должны установить разрешение на эмулятор/устройство для использования в Интернете! - Думаю, я это рассмотрел, но, возможно, я сделал это неправильно! В AndroidManifest.xml я добавил

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

Так что есть что.

2) (что я не так уверен), вы не можете запустить нить «сети» в потоке «ui». Я не совсем уверен, что это значит, но я пошел дальше и последовал за некоторым руководством по темам Android, Handlers и AsyncTasks. Здесь: Пожалуйста, проверьте код под учебник AsyncTask, который я последовал за:

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

После следующих вместе с учебником AsyncTask, я обнаружил, что я все еще имел тот же problem--

линию : HttpGet httpGet = new HttpGet (url) всегда выбрасывал исключение, как раньше.

Вот LogCat от моей попытки с заправочным учебником выше:

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 = 


Исключением является UnknownHostException, как вы можете увидеть:
«ava.net.UnknownHostException: Невозможно решить множество» search.twitter.com «: адрес не связан с именем хоста»
Но я не думаю, что сайт является неприемлемым ...

Может кто-нибудь сказать мне, что происходит на + то, что мне нужно d o пройти через это?

+0

Каковы исключения и трассировка стека? –

+1

Я добавил logcat к исходному вопросу, так как он длинный. –

+0

Добавление разрешений помогло мне. Но не забудьте изменить эту строку: '' to '' –

ответ

1

Я думаю, что проблема заключается в URL вы дали в запросе HTTP или подключение к Интернету пожалуйста, проверьте ссылку ниже, это поможет вам Link

+0

Ну, я не думаю, что проблема в URL-адресе, так как, когда я перехожу к URL-адресу на моем comp, я вижу, что неплохой уродливый 1liner Json заполняет экран. Я проверил эту ссылку, и я пробовал: System.setProperty («http.proxyHost», android.net.Proxy.getDefaultHost()); System.setProperty ("http.proxyPort", Integer.toString (proxyPort)); Я сделал это в начале моей заявки. На самом деле не знаю, что он делает - но это не решает проблему; –

+0

Может ли проблема быть в моих сетевых настройках? –

10

Фигурные его. По-видимому, я отключил AVD от «режима самолета».

Для всех, у кого такая же проблема, как у меня, вы, вероятно, используете беспроводную связь. По какой-то причине андрейд смотрит на вашу LAN-карту, поэтому перейдите к своим сетевым подключениям и щелкните правой кнопкой мыши на LAN-карте - ОТКЛЮЧАЙТЕ ЭТО ВЕЩЬ! Задача решена.

+0

MAN! вы спасли меня ... Я придерживался логики разрешений (runtime) и SO-поиска, что может привести к сбою вызова API ... – bqr

10

Проверьте права доступа манифеста, убедитесь, что вы добавили это:

<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

вы можете разрешить доступ к сети в главном потоке через следующий фрагмент кода. в начале вашего метода onCreate() вашей деятельности.

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

Выполнение сетевых запросов в основном потоке - очень плохая идея, это вызовет задержки в представлении пользовательского интерфейса , Это, скорее всего, приведет к плохим отзывам и 1 звездам. –

1

Я столкнулся с этой проблемой. В моем случае я использую HttpURLConnection для загрузки JSON. Проблема была исправлена, когда я включил «следовать переадресации». Вот фрагмент кода, который работает:

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