2013-08-07 5 views
11

Android Developers Blog consiglia di utilizzare HttpURLConnection diverso da apache HttpClient (http://android-developers.blogspot.com/2011/09/androids-http-clients.html). Prendo il consiglio e riscontro problemi nel segnalare il progresso del caricamento del file.C'è un modo per ottenere il progresso del caricamento correttamente con HttpUrlConncetion

il mio codice di afferrare il progresso è come questo:

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); 
} 

excutes questo codice molto veloce per tutto ciò che la dimensione del file, ma il file è in realtà ancora caricare sul server util ottengo risposta dal server. sembra che HttpURLConnection memorizzi nella cache tutti i dati nel buffer interno quando chiamo out.write().

Quindi, come posso ottenere il progresso effettivo del caricamento del file? Sembra che httpclient possa farlo, ma non è preferibile lo httpclient ... qualche idea?

+1

ottieni un incredibile e sorprendente +1 per essere uno dei sensati sviluppatori che non utilizzano il client di Apache. Alcune delle peggiori decisioni di rete in Android sono state viste su questo sito nel nome del client apache. In secondo luogo, in genere il progresso è rilevante nel caricare un file di grandi dimensioni. Quanto è grande il tuo file? In tal caso, la codifica del trasferimento Chunked è appropriata per il tuo file? – Tom

+0

@Tom La mia app deve supportare il caricamento di file non superiori a 30 m, e il lato server non supporta la codifica di trasferimento chunked ora ... – toki

+0

@Toki questo è vecchio ma nel caso ti stavi chiedendo di aver sbagliato la connessione nella riga 2. – charliebeckwith

risposta

14

ho trovato la spiegazione sul documento sviluppatore 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. 

Calling setFixedLengthStreamingMode() prima risolvere il mio problema. Ma come menzionato da this post, c'è un bug in Android che rende HttpURLConnection memorizza nella cache tutto il contenuto anche se è stato chiamato setFixedLengthStreamingMode(), che non è stato risolto fino a post-froyo. Quindi io uso HttpClient invece per pre-gingerbread.

+0

Questa è la cosa più utile che ho letto su StackOverflow riguardo a questo problema. Così tante persone hanno appena tracciato la scrittura nel buffer e hanno pensato di aver risolto il problema. – Brian

+0

@toki, qual è lo stato di questo bug ora? – avismara

-2

uso AsyncTask per caricare file da caricare il file sul server e creare un Progressdialog

1) eseguire il codice in

doinbackground(){ 
    your code here.. 
} 

2) aggiornare i progressi in

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

3) e In aggiornamento dei progressi

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

4) respingere il progresso nella

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

Non penso che l'OP abbia problemi a creare un'interfaccia utente per questo. L'OP vuole ottenere un'interpretazione affidabile di quanto di un flusso è stato letto sul socket. Da dove viene il "totale"? – Tom

+0

Tom ha ragione, voglio un modo per ottenere l'avanzamento della trasmissione di rete durante il caricamento del mio file, che è esattamente la quantità di byte che sono stati inviati al server sul socket layer. – toki

Problemi correlati