2012-04-03 37 views
2

我其中我執行一個AsyncTaskdoInBackground()方法我的http請求如下的設定:可以EntityUtils.toString()導致NetworkOnMainThreadException?

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

HttpResponse對象然後被傳遞到我的AsyncTaskonPostExecute()方法上的處理程序被傳遞(http請求的原始呼叫者)並按需要進行處理,如下所示:

  • 使用httpResponse.getStatusLine().getStatusCode()檢查響應代碼;
  • 使用EntityUtils.toString(httpResponse.getEntity())獲得響應內容)。

此設置在運行舊版Android的手機上運行良好。

現在在冰淇淋三明治(Galaxy Nexus)上運行我的應用程序我發現上面的應用程序中的前幾個http請求工作正常,但後來有一個http請求一直拋出帶有堆棧跟蹤的異常,如下所示在java.io.InputStreamReader中

....

在org.apache.http.util.EntityUtils.toString(EntityUtils.java:139)

:(爲可讀性略微修整) .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請求的建議,以便可以在主線程上處理響應?

+0

我有同樣的問題,但它只是發生在某些手機上,並且只在一些要求。有時EntityUtils.toString工作正常..怪異 – 2012-09-10 23:19:27

+0

另外注意EntityUtils.toString'的'默認字符集:HTTP:/ /stackoverflow.com/questions/30642237/what-exactly-returns-entityutils-tostringresponse/43611274#43611274 – 2017-04-25 12:58:51

回答

5

請嘗試以下操作:修改您的doInBackground函數以返回HTTP響應的值。

protected String doInBackground(HttpRequestBase... httpRequests) 
{ 
    HttpResponse httpResponse = HttpClient.execute(HttpUriRequest); 
    if (httpResponse.getEntity() != null) { 
     return EntityUtils.toString(httpResponse.getEntity()); 
    } 
    return ""; 
} 
+0

這隻給了我的消息實體的響應。我還需要狀態行(即'HttpResponse.getStatusLine()')和潛在的響應語言環境(即''HttpResponse.getLocale()')。我想我必須像你所建議的那樣,在'AsynTask.doInBackground()'方法中提取所有這些屬性,然後將它們包裝在我自己的'ServerResponse'類中以傳遞給'onPostExecute()'方法。除非有更好的方法?! – 2012-04-03 16:18:10

+0

是的。你必須這樣做。 – Blehi 2012-04-03 20:34:39

+0

你確定你必須這樣做嗎?爲什麼這些方法會聯網? – Adam 2012-11-20 06:01:11

相關問題