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を実行している電話で正常に機能しています。

今すぐIceCreamSandwich(Galaxy Nexus)でアプリを実行すると、上記のアプリの最初のいくつかのhttpリクエストは正常に機能しますが、次のようにスタックトレースで例外を一貫してスローするこの1つの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

次のことを試してください。HTTP応答の値を返すようにdoInBackground関数を変更してください。

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 に答える