Звучит странно, но у меня была точно такая же проблема. Приложение, над которым я работал, делало несколько последовательных запросов на загрузку набора миниатюрных изображений для отображения в ListView, и после второго оно зависало, как будто в коде HttpClient была мертвая блокировка.
Странное исправление, которое я обнаружил, - использовать AndroidHttpClient вместо DefaultHttpClient. Как только я сделал это, и я попробовал много вещей, прежде чем идти по этому пути, он начал работать просто отлично. Просто не забудьте вызвать client.close (), когда закончите с запросом.
AndroidHttpClient описывается в документации как DefaultHttpClient с «разумными настройками по умолчанию и зарегистрированными схемами для Android». Так как это было введено на уровне API 8 (Android 2.2), я откопал источник, чтобы продублировать эти «настройки по умолчанию», чтобы я мог использовать его дальше, чем этот уровень API. Вот мой код для дублирования значений по умолчанию и вспомогательного класса со статическим методом для его безопасного закрытия
public class HttpClientProvider {
// Default connection and socket timeout of 60 seconds. Tweak to taste.
private static final int SOCKET_OPERATION_TIMEOUT = 60 * 1000;
public static DefaultHttpClient newInstance(String userAgent)
{
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET);
HttpProtocolParams.setUseExpectContinue(params, true);
HttpConnectionParams.setStaleCheckingEnabled(params, false);
HttpConnectionParams.setConnectionTimeout(params, SOCKET_OPERATION_TIMEOUT);
HttpConnectionParams.setSoTimeout(params, SOCKET_OPERATION_TIMEOUT);
HttpConnectionParams.setSocketBufferSize(params, 8192);
SchemeRegistry schReg = new SchemeRegistry();
schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params, schReg);
DefaultHttpClient client = new DefaultHttpClient(conMgr, params);
return client;
}
}
А в другом классе ...
public static void safeClose(HttpClient client)
{
if(client != null && client.getConnectionManager() != null)
{
client.getConnectionManager().shutdown();
}
}