EntityUtils.toString()是否会导致NetworkOnMainThreadException?

Adi*_*ain 2 android android-networking android-compatibility

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

@Override
protected HttpResponse doInBackground(HttpRequestBase... httpRequests)
{
    HttpResponse httpResponse = HttpClient.execute(HttpUriRequest);
    return httpResponse;
}
Run Code Online (Sandbox Code Playgroud)

HttpResponse然后将此对象传递给onPostExecute()我的方法,AsyncTask以传递给处理程序(http请求的原始调用者)并根据需要进行处理,如下所示:

  • 使用检查响应代码httpResponse.getStatusLine().getStatusCode();
  • 获取响应内容使用EntityUtils.toString(httpResponse.getEntity())).

此设置在运行旧版Android的手机上运行良好.

现在在冰淇淋三明治(Galaxy Nexus)上运行我的应用程序我发现上面我的应用程序中的前几个http请求工作正常,但是有一个http请求始终抛出异常,堆栈跟踪如下(略微修剪为可读性):

....

at 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请求以便可以在主线程上处理响应的任何建议吗?

Ble*_*ehi 5

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

protected String doInBackground(HttpRequestBase... httpRequests)
{
    HttpResponse httpResponse = HttpClient.execute(HttpUriRequest);
    if (httpResponse.getEntity() != null) {
      return EntityUtils.toString(httpResponse.getEntity());
    }
    return "";
}
Run Code Online (Sandbox Code Playgroud)

  • 当消耗实体内容(例如转换为字符串)时,它正在从网络缓冲区读取字节.我个人喜欢使用ResponseHandler并返回一个结果对象,但请注意Android正在远离Apache HttpClient(请参阅http://android-developers.blogspot.com/2011/09/androids-http-clients.html). (2认同)