2009-11-16 2 views
1

У меня есть код, который выполняет кучу HTTP GET, POST и PUT с использованием Commons HttpClient 3.1. Я бы хотел указать текущий индикатор скорости передачи в моем графическом интерфейсе, но не смог найти какие-либо методы для определения скорости передачи обрабатываемого HttpMethod.Как получить текущую скорость передачи в Commons HttpClient 3.x

Я мог легко просто передать время и выполнить некоторую простую математику после того, как она была заполнена, чтобы определить, что такое скорость, но это обеспечивает плохую работу пользователя при длительной загрузке или загрузке. Кто-нибудь знает, как определить скорость передачи запроса Commons HttpClient , а все еще обрабатывается?

ответ

3

Я не использовал HttpClient экстенсивно, поэтому может быть простой крючок. Однако оказалось, что HttpConnection.getResponseInputStream() возвращает простой InputStream.

Чтобы добавить крючок самостоятельно, вам необходимо переопределить HttpConnectionManager и HttpConnection, чтобы вернуть декорированный поток, который отслеживает количество прочитанных байтов. Затем вы можете развернуть второй поток для опроса этого потока и отображения скорости передачи или (лучше) создать поток с обратным вызовом каждые N байтов (лучше, потому что вам не нужно заботиться о параллелизме, и вы также можете установить N так что обратный вызов вызывается только для больших файлов).

+0

Похоже, что я могу совместить этот совет с кодом от ht tp: //docstore.mik.ua/orelly/java-ent/dist/ch08_04.htm и заставить что-то работать, я попробую его и отчитаю. –

+0

Работы. К сожалению, лучшего способа найти не могу. Достаточно хорошо! –

1

Simpler крючок будет продлить HttpEntityWrapper и переопределить метод getContent():

public InputStream getContent() throws IOException { 
    InputStream wrappedin = wrappedEntity.getContent(); 
    return new MyTransferRateInputStream(wrappedin); 
} 

Позже вы можете добавить это как ответ перехватчик

httpClient.addResponseInterceptor(HttpResponseInterceptor itcp) 

Таким образом, вам не нужно переопределить упомянутые HttpConnectionManager и HttpConnection

Смежные вопросы