Есть ли способ правильно загрузить результат загрузки с помощью HttpUrlConncetion

Блог разработчиков Android рекомендует использовать HttpURLConnection кроме HttpClient apache ( http://android-developers.blogspot.com/2011/09/androids-http-clients.html ). Я беру совет и получаю проблемы с сообщением о загрузке файлов.

Мой код для достижения прогресса выглядит следующим образом:

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

Этот код очень быстро запускается для любого размера файла, но файл на самом деле все еще загружается на сервер, и я получаю ответ от сервера. Кажется, что HttpURLConnection кэширует все данные во внутреннем буфере, когда я вызываю out.write() .

Итак, как я могу получить фактический процесс загрузки файлов? Похоже, что httpclient может это сделать, но httpclient не предпочтительнее … любая идея?

Я нашел объяснение в документе разработчика 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. 

Вызов setFixedLengthStreamingMode() сначала исправить мою проблему. Но, как упоминалось в этом сообщении , в android есть ошибка, которая заставляет HttpURLConnection кэшировать весь контент, даже если был setFixedLengthStreamingMode() , который не фиксируется до тех пор, пока не появится post-froyo. Поэтому я использую HttpClient вместо этого для преджекторного хлеба.

Используйте Asynctask для загрузки файла для загрузки файла на сервер и создания Progressdialog

1) запустите свой код в

  doinbackground(){ your code here.. } 

2) обновить прогресс в

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

3) и «О обновлении прогресса»

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

4) отклонить прогресс в

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