Android Developers Blog poleca używać HttpURLConnection
inne niż Apache HttpClient
(http://android-developers.blogspot.com/2011/09/androids-http-clients.html). Biorę radę i pojawia się problem z raportowaniem postępu przesyłania plików.Czy istnieje jakiś sposób, aby przesłać postęp poprawnie HttpUrlConncetion
mój kod chwycić postęp jest tak:
try {
out = conncetion.getOutputStream();
in = new BufferedInputStream(fin);
byte[] buffer = new byte[MAX_BUFFER_SIZE];
int r;
while ((r = in.read(buffer)) != -1) {
out.write(buffer, 0, r);
bytes += r;
if (null != mListener) {
long now = System.currentTimeMillis();
if (now - lastTime >= mListener.getProgressInterval()) {
lastTime = now;
if (!mListener.onProgress(bytes, mSize)) {
break;
}
}
}
}
out.flush();
} finally {
closeSilently(in);
closeSilently(out);
}
ten kod excutes bardzo szybko, niezależnie od rozmiaru pliku, ale plik jest w rzeczywistości nadal przesyłanie do serwera util ja dostać odpowiedź od serwera. wydaje się, że HttpURLConnection
buforuje wszystkie dane w buforze wewnętrznym, gdy wywołuję out.write()
.
W jaki sposób mogę uzyskać postęp w przesyłaniu plików? Wydaje się, że może to zrobić, ale httpclient
nie jest preferowany ... jakiś pomysł?
dostajesz niesamowitą +1 za bycie jednym z rozsądnych programistów, którzy nie używają klienta Apache. Niektóre najgorsze decyzje dotyczące sieci w Androidzie pojawiły się na tej stronie w imieniu klienta apache. Po drugie, zazwyczaj postępem jest odpowiednie przesyłanie dużego pliku. Jak duży jest twój plik? Jeśli tak, to czy kodowane kodowanie transferu jest odpowiednie dla twojego pliku? – Tom
@Tom Moja aplikacja musi obsługiwać przesyłanie plików nie większych niż 30m, a strona serwerowa nie obsługuje teraz kodowania transferu kodowanego ... – toki
@Toki to jest stare, ale w przypadku, gdy zastanawiałeś się, czy błędnie wpisałeś połączenie w linii 2. – charliebeckwith