【发布时间】:2012-04-17 07:25:57
【问题描述】:
我有一个设置,我在AsyncTask 的doInBackground() 方法中执行我的http 请求,如下所示:
@Override
protected HttpResponse doInBackground(HttpRequestBase... httpRequests)
{
HttpResponse httpResponse = HttpClient.execute(HttpUriRequest);
return httpResponse;
}
这个HttpResponse 对象随后被传递给我的AsyncTask 的onPostExecute() 方法,以传递给处理程序(http 请求的原始调用者)并根据需要进行处理,如下所示:
- 使用
httpResponse.getStatusLine().getStatusCode()检查响应码; - 使用
EntityUtils.toString(httpResponse.getEntity())获取响应内容。
此设置在运行旧版 Android 的手机上运行良好。
现在在 Ice Cream Sandwich (Galaxy Nexus) 上运行我的应用程序我发现我的应用程序中的前几个 http 请求可以正常工作,但随后有一个 http 请求始终引发异常,堆栈跟踪如下 (为了便于阅读,略微修剪):
....
在 org.apache.http.util.EntityUtils.toString(EntityUtils.java:139)
在 java.io.InputStreamReader.close(InputStreamReader.java:145)
在 org.apache.http.conn.EofSensorInputStream.close(EofSensorInputStream.java:213)
...
在 libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:151)
在 android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1084)
android.os.NetworkOnMainThreadException
我很困惑。这是否意味着EntityUtils.toString(HttpEntity) 方法是抛出新的(而且非常烦人的)NetworkOnMainThreadException 的潜在罪魁祸首?如果是这样,关于修改我的设置以在单独的线程中发出 http 请求以便可以在主线程上处理响应的任何建议?
【问题讨论】:
-
我也有同样的问题,但它只发生在某些手机上,而且只发生在某些请求上。有时 EntityUtils.toString 工作正常。很奇怪
-
还要注意
EntityUtils.toString的默认字符集:stackoverflow.com/questions/30642237/…
标签: android android-networking android-compatibility