2012-12-11 10 views
5

मेरा कार्य यहां है। अक्षांश और देशांतर की एक जोड़ी को देखते हुए, मैं Google स्थल API से JSON प्राप्त करना चाहता हूं। निम्नलिखित फ़ंक्शन, रिवर्सजीओकोडिंग, स्ट्रिंग JSON लौटाता है।एंड्रॉइड प्लेटफ़ॉर्म पर HttpsURLConnectionImpl.getInputStream() त्रुटि

public String reverseGeoCoding(String lat, String lng) { 
    latitude = lat; 
    longitude = lng; 
    String json = new String(); 
    String url = new String(); 

    URL googleAPI; 
    try { 
     url = URL + "location=" + latitude + "," + longitude + "&" + "radius=" + radius + "&" + "language=" + language + "&" + "sensor=false" + "&" + "key=" + APIKey; 

     googleAPI = new URL(url); 
     Log.d("TEST", googleAPI.toString()); 
     URLConnection gc = (URLConnection) googleAPI.openConnection(); 
     Log.d("TEST", gc.toString()); 

     InputStream is = gc.getInputStream(); 
     Log.d("TEST", "InputStream created"); 
     BufferedReader in = new BufferedReader(new InputStreamReader(is)); 
     Log.d("TEST", "reader created"); 
     String inputLine; 
     while ((inputLine = in.readLine()) != null) { 
      json = json + inputLine + "\n"; 
      Log.d("TEST", inputLine); 
     } 

     in.close(); 

    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    return json; 
} 

हालांकि, getInputStream() काम नहीं करता है। मैंने वेब ब्राउज़र पर यूआरएल अनुरोध की जांच की है, और यह ठीक से काम करता है (एक JSON दस्तावेज़ को पुनर्प्राप्त करना)।

त्रुटि संदेश नीचे दिए गए हैं। (क्यों लाइनों 17 और 18 त्रुटियां उत्पन्न)

1. 12-11 00:46:02.862: W/System.err(12953): android.os.NetworkOnMainThreadException 
2. 12-11 00:46:02.872: W/System.err(12953):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1084) 
3. 12-11 00:46:02.872: W/System.err(12953):  at java.net.InetAddress.lookupHostByName(InetAddress.java:391) 
4. 12-11 00:46:02.872: W/System.err(12953):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242) 
5. 12-11 00:46:02.872: W/System.err(12953):  at java.net.InetAddress.getAllByName(InetAddress.java:220) 
6. 12-11 00:46:02.872: W/System.err(12953):  at libcore.net.http.HttpConnection.<init>(HttpConnection.java:71) 
7. 12-11 00:46:02.872: W/System.err(12953):  at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50) 
8. 12-11 00:46:02.882: W/System.err(12953):  at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351) 
9. 12-11 00:46:02.882: W/System.err(12953):  at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86) 
10. 12-11 00:46:02.882: W/System.err(12953): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 
11. 12-11 00:46:02.882: W/System.err(12953): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308) 
12. 12-11 00:46:02.882: W/System.err(12953): at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:460) 
13. 12-11 00:46:02.882: W/System.err(12953): at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:432) 
14. 12-11 00:46:02.882: W/System.err(12953): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282) 
15. 12-11 00:46:02.882: W/System.err(12953): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232) 
16. 12-11 00:46:02.882: W/System.err(12953): at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273) 
17. 12-11 00:46:02.882: W/System.err(12953): at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168) 
18. 12-11 00:46:02.894: W/System.err(12953): at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:270) 
19. 12-11 00:46:02.894: W/System.err(12953): at locationpredict.POIList.reverseGeoCoding(POIList.java:55) 
20. 12-11 00:46:02.894: W/System.err(12953): at locationpredict.TestMain$1.onClick(TestMain.java:62) 

उत्तर

2

> android.os.NetworkOnMainThreadException :

अपवाद है कि जब एक आवेदन प्रयास अपने मुख्य थ्रेड पर एक नेटवर्किंग कार्रवाई करने के लिए फेंक दिया है।

इस त्रुटि से बचने के लिए AsyncTask का उपयोग करें। और doInBackground के अंदर सभी नेटवर्क से संबंधित कार्य को AsyncTask

5

मुख्य थ्रेड पर भारी नेटवर्किंग ऑपरेशन का उपयोग करने वाले लोगों की वजह से एप्लिकेशन को उत्तरदायीता की ओर ले जाता है, यह नया कार्य लोगों को ऐसा करने से रोकने के लिए जोड़ा गया है।
आपको ऐसा करने के लिए AsyncTask या सेवा का उपयोग करना चाहिए।

 private class GetJsonTask extends AsyncTask<String, Void, String>{ 


      @Override 
      protected String doInBackground(String... params) { 
     try { 
      latitude = params[0]; 
      longitude = params[1]; 
      String json = new String(); 
      String url = new String(); 
      URL googleAPI; 


      url = URL + "location=" + latitude + "," + longitude + "&" + "radius=" + radius + "&" + "language=" + language + "&" + "sensor=false" + "&" + "key=" + APIKey; 

      googleAPI = new URL(url); 
      Log.d("TEST", googleAPI.toString()); 
      URLConnection gc = (URLConnection) googleAPI.openConnection(); 
      Log.d("TEST", gc.toString()); 

      InputStream is = gc.getInputStream(); 
      Log.d("TEST", "InputStream created"); 
      BufferedReader in = new BufferedReader(new InputStreamReader(is)); 
      Log.d("TEST", "reader created"); 
      String inputLine; 
      while ((inputLine = in.readLine()) != null) { 
       json = json + inputLine + "\n"; 
       Log.d("TEST", inputLine); 
      } 

      in.close(); 

     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return json; 
    } 

    @Override 
     protected void onPostExecute(String result) { 
      parseJson(result); // json should be stored in the result 
     } 
    } 

private void parseJson(String json){ 
    JSONObject obj = new JSONObject(json); 
.... 

} 

इसे इस तरह कॉल:

String[] data = new String[2]; 
data[0] = lat; 
data[1] = long; 
new GetJsonTask().execute(data); 

या आप विधि कॉल करने से पहले अपने OnCreate() विधि में निम्न कोड जोड़कर बायपास कर सकते हैं, लेकिन मैं इस विधि की सिफारिश नहीं है। परीक्षण के लिए बस इसका इस्तेमाल करें।

if(Build.VERSION.SDK_INT >= 9){ 
      StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
      StrictMode.setThreadPolicy(policy); 
    } 
+0

समस्या हल हो गई !! आपका बहुत बहुत धन्यवाद। – jaehui

+0

एक और सवाल, ओवरराइड विधि ,PostExecute वापसी शून्य पर। मैं Google Places API से onPostExecute तक परिणाम कैसे प्राप्त कर सकता हूं? – jaehui

+0

परिणाम स्ट्रिंग परिणाम में हैं। आप अपने जेसन को onPostExecute() विधि के अंदर पार्स कर सकते हैं। या इसे मेरे उदाहरण की तरह एक विधि के साथ पास करें और क्लीनर कोड के लिए इसे पार्स करें। –

0

जैसा कि अन्य उत्तरों सुझाव देते हैं, async कार्य का उपयोग करें। जेसन स्ट्रिंग से ऑब्जेक्ट्स को कनवर्ट करने के लिए gson भी अनुशंसा करें!

संबंधित मुद्दे