Есть ли способ получить правильную загрузку с помощью HttpUrlConncetion
Блог разработчиков Android рекомендует использовать HttpURLConnection
кроме apache HttpClient
(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
не нравится... любая идея?
Ответы
Ответ 1
Я нашел объяснение в документе разработчика 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()
, который не фиксируется до публикации -froyo. Таким образом, я использую HttpClient вместо этого для pre-gingerbread.
Ответ 2
использовать 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);