Есть ли способ получить правильную загрузку с помощью 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);