2012-02-28 19 views
8

मैं एक एंड्रॉइड प्रोजेक्ट पर काम कर रहा हूं और मैं उस बिंदु पर हूं जहां मैं जानकारी के लिए कुछ एपीआई पूछना चाहता हूं। ऐसा लगता है कि यह बहुत बुनियादी होना चाहिए!एंड्रॉइड समस्या का उपयोग कर HttpResponse: निष्पादन हमेशा अपवाद का कारण बनता है?

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

जहां यूआरएल चर स्ट्रिंग है "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' धागे के भीतर 'नेटवर्किंग' धागा शुरू नहीं कर सकते हैं। मुझे पूरा यकीन नहीं है कि इसका क्या अर्थ है, लेकिन मैं आगे बढ़ गया और एंड्रॉइड थ्रेड, हैंडलर और असिनक टास्क पर कुछ ट्यूटोरियल का पालन किया। यहाँ: कृपया AsyncTask ट्यूटोरियल है, जो मैं पीछा के तहत कोड की जाँच:

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

AsyncTask ट्यूटोरियल के साथ पालन करने के बाद, मैंने पाया कि मैं अभी भी एक ही problem--

लाइन थी : एचटीपीजीट httpGet = नया एचटीपीजीट (यूआरएल) हमेशा पहले जैसा अपवाद फेंक दिया।

यहाँ ऊपर सूत्रण ट्यूटोरियल के साथ मेरी प्रयास से logcat है:
"ava.net.UnknownHostException: मेजबान को हल करने में असमर्थ"

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 के रूप में आप देख सकते हैं search.twitter.com ": नहीं पता होस्ट नाम के साथ जुड़े"
लेकिन मुझे नहीं लगता कि साइट अस्वीकार्य है कि ...

किसी को भी मुझे बता सकते हैं क्या हो रहा है + मैं क्या घ की जरूरत है ओ इसके माध्यम से पाने के लिए?

+0

अपवाद और स्टैक ट्रेस क्या हैं? –

+1

मैंने मूल प्रश्न में लॉगकैट जोड़ा, क्योंकि यह लंबा है। –

+0

अनुमतियों को जोड़ने से यह मेरे लिए हल हो गया। लेकिन, इस लाइन को बदलना सुनिश्चित करें: '<उपयोग-अनुमति एंड्रॉइड: name =" android.permission.INTERNET ">' से '<उपयोग-अनुमति एंड्रॉइड: name =" android.permission.INTERNET ">' –

उत्तर

1

मैं इस समस्या यूआरएल आप http अनुरोध या इंटरनेट कनेक्शन में दे दिया है में रहता है लगता है कृपया नीचे दिए गए लिंक की जाँच यह मदद से आप Link

+0

ठीक है, मुझे नहीं लगता कि समस्या मेरे यूआरएल पर यूआरएल पर जाने के बाद से यूआरएल में है, मैं स्क्रीन को भरने के लिए एक अच्छा बदसूरत 1liner जेसन देखता हूं। मैंने उस लिंक को चेक किया और मैंने कोशिश की है: System.setProperty ("http.proxyHost", android.net.Proxy.getDefaultHost()); System.setProperty ("http.proxyPort", Integer.toString (प्रॉक्सीपोर्ट)); मैंने इसे अपने आवेदन की शुरुआत में किया था। वास्तव में यह नहीं पता कि यह क्या करता है - लेकिन यह इस मुद्दे को हल नहीं करता है; –

+0

क्या समस्या मेरी नेटवर्क सेटिंग्स में हो सकती है? –

10

यह पता चल। जाहिर है मैंने अपने एवीडी को "हवाई जहाज मोड" से बंद कर दिया।

किसी के लिए मेरे जैसा ही समस्या है, तो आप शायद वायरलेस का उपयोग कर रहे हैं। किसी कारण से एंड्रॉइड आपके लैन कार्ड को देखता है, इसलिए अपने नेटवर्क कनेक्शन पर जाएं और लैन कार्ड पर राइट क्लिक करें - यह समझें! समस्या सुलझ गयी।

+0

मैन! आपने मुझे बचाया ... मैं (रनटाइम) अनुमतियों पर तर्क और एसओ खोज रहा हूं, जो एपीआई कॉल को क्रैश कर सकता है ... – 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

आप निम्नलिखित स्निपेट के माध्यम से मुख्य थ्रेड में नेटवर्क एक्सेस की अनुमति कर सकते हैं। आपकी गतिविधि की आपकी ऑनक्रेट() विधि की शुरुआत में।

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

मुख्य धागे पर नेटवर्क अनुरोध करना एक बहुत बुरा विचार है, इससे आपके यूआई प्रतिपादन में देरी हो जाएगी । इससे अधिकतर खराब समीक्षा और 1 सितारे हो जाएंगे। –

1

मैं भी इस समस्या में भाग गया। मेरे मामले में, मैं JSON लोड करने के लिए HttpURLConnection का उपयोग कर रहा हूं। जब मैं "रीडायरेक्ट का पालन करें" सक्षम करता हूं तो समस्या ठीक हो गई थी। यहां एक कोड-स्निपेट है जो काम करता है:

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