progreso - progressbar android circle
¿Hay alguna forma de subir el progreso de carga correctamente con HttpUrlConncetion? (2)
El Blog de Desarrolladores de Android recomienda utilizar HttpURLConnection
no sea HttpClient
de apache ( http://android-developers.blogspot.com/2011/09/androids-http-clients.html ). Tomo el consejo y tengo problemas para informar el progreso de carga de archivos.
mi código para tomar el progreso es así:
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);
}
Este código se ejecuta muy rápido para cualquier tamaño de archivo, pero el archivo aún se está cargando en el servidor. Recibo la respuesta del servidor. parece que HttpURLConnection
caché todos los datos en el búfer interno cuando out.write()
.
Entonces, ¿cómo puedo obtener el progreso real de carga de archivos? Parece que httpclient
puede hacer eso, pero httpclient
no es preferido ... ¿ httpclient
idea?
utilice Asynctask para cargar archivos y cargarlos al servidor y crear un diálogo de progreso
1) ejecuta tu código en
doinbackground(){
your code here..
}
2) actualizar el progreso en
publishProgress("" + (int) ((total * 100) / lenghtOfFile));
//type this in the while loop before write..
3) y sobre la actualización del progreso
protected void onProgressUpdate(String... progress) {
Progress.setProgress(Integer.parseInt(progress[0]));
}
4) descartar el progreso en
protected void onPostExecute(String file_url) {
dismissDialog(progress);
Encontré la explicación en el documento de desarrollador 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.
Al llamar a setFixedLengthStreamingMode()
primero setFixedLengthStreamingMode()
mi problema. Pero como se menciona en esta publicación , hay un error en Android que hace que HttpURLConnection
caché todo el contenido incluso si se ha llamado a setFixedLengthStreamingMode()
, que no se corrige hasta post-froyo. Así que uso HttpClient en lugar de pregingerbread.