2012-02-28 30 views
8

Tôi đã làm việc trên một dự án Android và tôi đang ở một điểm mà tôi muốn hỏi một số API để biết thông tin. Có vẻ như điều này rất cơ bản!HttpResponse sử dụng vấn đề android: thực hiện luôn luôn gây ra ngoại lệ?

Dưới đây là các ý chính chung của mã của tôi:

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

nơi biến url là chuỗi "http://search.twitter.com/search.json?q=javacodegeeks".

Như bạn có thể thấy có một số thông tin JSON đẹp tại trang web đó; Vấn đề của tôi là mỗi lần '' client.execute (getRequest); '' được gọi, chương trình sẽ ném và bắt một ngoại lệ. Không hữu ích!

Tôi đã nghe hai điều:

1) Bạn phải đặt quyền cho trình giả lập/thiết bị sử dụng internet! - Tôi nghĩ rằng tôi đã đề cập đến điều này, nhưng có lẽ tôi đã làm sai! Trong androidmanifest.xml tôi đã thêm

Vậy là có.

2) (mà tôi không chắc chắn về) bạn không thể bắt đầu chuỗi 'nối mạng' trong chuỗi 'ui'. Tôi không hoàn toàn chắc chắn điều này có nghĩa là gì, nhưng tôi đã đi trước và làm theo một số hướng dẫn về Android Threads, Handlers và AsyncTasks. Ở đây: Xin vui lòng kiểm tra mã dưới sự hướng dẫn AsyncTask, mà tôi theo:

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

Sau khi làm theo cùng với các hướng dẫn AsyncTask, tôi thấy rằng tôi vẫn có cùng problem--

dòng : HttpGet httpGet = new HttpGet (url) luôn ném một ngoại lệ, như trước đây.

Đây là logcat từ nỗ lực của tôi với hướng dẫn luồng trên:

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 = 


Trường hợp ngoại lệ là một UnknownHostException như bạn có thể thấy:
"ava.net.UnknownHostException: Không thể giải quyết host" search.twitter.com ": Không có địa chỉ nào được liên kết với tên máy chủ"
Nhưng tôi không nghĩ rằng trang web là không thể chấp nhận được ...

Bất cứ ai có thể cho tôi biết điều gì đang xảy ra + những gì tôi cần o để vượt qua nó?

+0

ngoại lệ và theo dõi ngăn xếp là gì? –

+1

Tôi đã thêm logcat vào câu hỏi origional, vì nó dài. –

+0

Thêm quyền đã giải quyết nó cho tôi. Tuy nhiên, hãy chắc chắn thay đổi dòng này: '' to '' –

Trả lời

1

Tôi nghĩ vấn đề nằm trong url bạn đã được đưa ra trong yêu cầu http hoặc kết nối internet pls kiểm tra liên kết bên dưới nó sẽ giúp bạn Link

+0

Vâng, tôi không nghĩ rằng vấn đề là trong URL kể từ khi tôi đi đến URL trên comp của tôi, tôi thấy một xấu xí 1liner Json xấu xí làm đầy lên màn hình. Tôi đã kiểm tra liên kết đó và tôi đã thử: System.setProperty ("http.proxyHost", android.net.Proxy.getDefaultHost()); System.setProperty ("http.proxyPort", Integer.toString (proxyPort)); Tôi đã làm điều này vào đầu đơn đăng ký của mình. Thực sự không biết nó làm gì - nhưng nó không giải quyết được vấn đề; –

+0

Sự cố có thể ở trong cài đặt mạng của tôi không? –

10

đặn nó ra. Dường như tôi đã tắt AVD của tôi về "chế độ trên máy bay".

Đối với bất kỳ ai có cùng vấn đề với tôi, có thể bạn đang sử dụng không dây. Vì lý do nào đó, andriod xem xét card mạng LAN của bạn, vì vậy hãy vào Network Connections của bạn và kích chuột phải vào card mạng LAN - DISABLE THAT THING! Đã giải quyết được sự cố.

+0

MAN! bạn đã lưu tôi ... Tôi bị kẹt trên (thời gian chạy) quyền logic và SO tìm kiếm, những gì có thể sụp đổ cuộc gọi API ... – bqr

10

Kiểm tra các điều khoản của biểu hiện của bạn, hãy chắc chắn bạn đã thêm này:

<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

bạn có thể cho phép truy cập mạng trong các chủ đề chính qua đoạn sau. vào đầu phương thức onCreate() của bạn trong hoạt động của bạn.

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

Thực hiện yêu cầu mạng trên chuỗi chính là một ý tưởng rất tồi, nó sẽ gây ra sự chậm trễ trong hiển thị giao diện người dùng của bạn . Điều này rất có thể sẽ dẫn đến đánh giá xấu và 1 sao. –

1

Tôi cũng gặp sự cố này. Trong trường hợp của tôi, tôi đang sử dụng HttpURLConnection để tải JSON. Sự cố đã được khắc phục khi tôi bật "theo dõi chuyển hướng". Dưới đây là đoạn mã hoạt động:

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()); 
      } 
     } 
    } 
Các vấn đề liên quan