带有完成的HTTPResponse的带有InputStreamReader的BufferedReader导致NetworkOnMainThreadException

时间:2014-04-25 11:15:13

标签: android android-asynctask networkonmainthread

我有一些代码可以将我的HTTPResponse对象转换为JSONObject,这在大多数情况下都可以正常运行:

public static JSONObject httpResponseToJson(HttpResponse response) {
    if (response != null) {
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(),
                    "UTF-8"));
            String json = reader.readLine();
            if (json != null) {
                JSONObject jsonObject = new JSONObject(json);
                printStatus(jsonObject);
                return jsonObject;
            }
        } catch (JSONException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return null;
}

但是,有时它会引发Android NetworkOnMainThread exception。我无法弄清楚原因,因为响应已经完成,并且该呼叫不应再涉及任何网络IO。出于测试原因,如果我允许NetworkOnMainThread,此方法始终可以正常工作。

请注意,所有HTTPResponse都是使用AsyncTask获取的,而且运行正常。

我对任何建议都很感兴趣。

2 个答案:

答案 0 :(得分:1)

HttpResponse对象中读取响应也涉及Network Operation。只需在doInBackground()方法中进行处理,然后修改您的AsyncTask,以便在处理后将实际结果传递给onPostExecute()

答案 1 :(得分:0)

这意味着你在主线程上执行一些网络操作。这里的要点是除非流没有关闭,否则你仍在执行网络操作,所以也将该部分移到doInBackGround()