首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android平台上的HttpsURLConnectionImpl.getInputStream()错误

Android平台上的HttpsURLConnectionImpl.getInputStream()错误
EN

Stack Overflow用户
提问于 2012-12-11 09:09:15
回答 3查看 4.1K关注 0票数 5

这是我的任务。给定一对纬度和经度,我想从Google Places API获得一个JSON。下面的函数reverseGeoCoding返回字符串JSON。

代码语言:javascript
复制
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()不起作用。我已经检查了浏览器上的url请求,它工作正常(重新生成一个JSON文档)。

错误消息如下。(为什么第17行和第18行产生错误)

代码语言:javascript
复制
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)
EN

回答 3

Stack Overflow用户

发布于 2012-12-11 09:25:41

由于人们在主线程上使用繁重的网络操作,导致应用程序无响应,因此添加了这一新功能,以防止人们这样做。

您应该使用AsyncTask或服务来完成此操作。

代码语言:javascript
复制
        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);
....

}

这样叫它:

代码语言:javascript
复制
String[] data = new String[2];
data[0] = lat;
data[1] = long;
new GetJsonTask().execute(data);

或者,您可以在调用onCreate()方法之前,通过在该方法中添加以下代码来绕过它,但我不推荐使用这种方法。只需将其用于测试。

代码语言:javascript
复制
   if( Build.VERSION.SDK_INT >= 9){
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
    }
票数 5
EN

Stack Overflow用户

发布于 2012-12-11 09:14:16

> android.os.NetworkOnMainThreadException :

当应用程序试图在其主线程上执行网络操作时引发的异常。

使用AsyncTask可避免此错误。并将所有与网络相关的任务都放在AsyncTask的doInBackground方法中

票数 2
EN

Stack Overflow用户

发布于 2012-12-11 10:25:42

正如其他答案所建议的,使用异步任务。也推荐使用gson将对象转换为json字符串,或者将其转换为json字符串!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13812051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档