2013-08-07 11 views
11

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ł?

+1

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

+0

@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

+0

@Toki to jest stare, ale w przypadku, gdy zastanawiałeś się, czy błędnie wpisałeś połączenie w linii 2. – charliebeckwith

Odpowiedz

14

znalazłem wyjaśnienie dokumentu deweloper http://developer.android.com/reference/java/net/HttpURLConnection.html

To upload data to a web server, configure the connection for output using setDoOutput(true). 
For best performance, you should call either setFixedLengthStreamingMode(int) when the body length is known in advance, or setChunkedStreamingMode(int) when it is not. Otherwise HttpURLConnection will be forced to buffer the complete request body in memory before it is transmitted, wasting (and possibly exhausting) heap and increasing latency. 

Wywołanie setFixedLengthStreamingMode() najpierw rozwiązać mój problem. Ale jak wspomniałem przez this post, w systemie Android występuje błąd, który powoduje, że HttpURLConnection buforuje wszystkie treści, nawet jeśli został wywołany setFixedLengthStreamingMode(), który nie jest poprawiony do czasu po froyo. Więc używam HttpClient zamiast pre-piernika.

+0

To jest najbardziej przydatna rzecz, którą przeczytałem na temat StackOverflow dotyczącą tego problemu. Tak wielu ludzi właśnie śledziło zapis do bufora i myślało, że rozwiązali problem. – Brian

+0

@toki, jaki jest teraz status tego błędu? – avismara

-2

użycie Asynctask przesłać plik, aby przesłać plik na serwer i stworzyć Progressdialog

1) uruchomić kod w

doinbackground(){ 
    your code here.. 
} 

2) zaktualizować postęp w

publishProgress("" + (int) ((total * 100)/lenghtOfFile)); 
    //type this in the while loop before write.. 

3) i Po aktualizacji postępów

protected void onProgressUpdate(String... progress) { 
      Progress.setProgress(Integer.parseInt(progress[0])); 
     } 

4) odrzucenie postęp w

protected void onPostExecute(String file_url) { 
      dismissDialog(progress); 
+0

Nie sądzę, że OP ma problemy z tworzeniem interfejsu użytkownika. OP chce uzyskać wiarygodną interpretację ilości odczytywanego strumienia na gniazdo. Skąd się bierze "total"? – Tom

+0

Tom ma rację, chcę mieć sposób na uzyskanie postępu transmisji sieciowej podczas przesyłania mojego pliku, który jest dokładnie tym, ile bajtów wysłano do serwera na warstwie gniazda. – toki

Powiązane problemy