2

我有一个设置,我以如下doInBackground()方法执行我的 http 请求:AsyncTask

@Override
protected HttpResponse doInBackground(HttpRequestBase... httpRequests)
{
    HttpResponse httpResponse = HttpClient.execute(HttpUriRequest);
    return httpResponse;
}

然后将此HttpResponse对象传递给onPostExecute()my 的方法AsyncTask以传递给处理程序(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 请求以便可以在主线程上处理响应的任何建议?

4

1 回答 1

5

请尝试以下操作:修改您的 doInBackground 函数以返回 HTTP 响应的值。

protected String doInBackground(HttpRequestBase... httpRequests)
{
    HttpResponse httpResponse = HttpClient.execute(HttpUriRequest);
    if (httpResponse.getEntity() != null) {
      return EntityUtils.toString(httpResponse.getEntity());
    }
    return "";
}
于 2012-04-03T15:49:10.743 回答