Cómo implementar la barra de progreso de carga de archivos en android

Estoy subiendo archivos a través de org.apache.http.client.HttpClient en android y necesito implementar barra de progreso. ¿Es posible aprovechar el progreso de:?

 HttpPost httppost = new HttpPost("some path"); HttpClient httpclient = new DefaultHttpClient(); try { File file = new File("file path"); InputStream in = new BufferedInputStream(new FileInputStream(file)); byte[] bArray = new byte[(int) file.length()]; in.read(bArray); String entity = Base64.encodeToString(bArray, Base64.DEFAULT); httppost.setEntity(new StringEntity(entity)); HttpResponse response = httpclient.execute(httppost); } 

Si no, por favor, muestre una forma alternativa. Gracias

Lo que usted va a querer hacer es crear un AsyncTask que puede manejar esto para usted, reemplazando el método onProgressUpdate.

Aquí está una versión reducida de algo que probé en otra aplicación usando HttpURLConnection . Puede haber algunas pequeñas redundancias y creo que HttpURLConnection puede ser generalmente mal visto, pero esto debería funcionar. Simplemente utilice esta clase en cualquier clase de actividad que esté usando (en este ejemplo, me refiero a ella como TheActivity ) llamando a new FileUploadTask().execute() . Por supuesto, puede que tenga que modificar esto para que se adapte a las necesidades de su aplicación.

 private class FileUploadTask extends AsyncTask<Object, Integer, Void> { private ProgressDialog dialog; @Override protected void onPreExecute() { dialog = new ProgressDialog(TheActivity.this); dialog.setMessage("Uploading..."); dialog.setIndeterminate(false); dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); dialog.setProgress(0); dialog.show(); } @Override protected Void doInBackground(Object... arg0) { try { File file = new File("file path"); FileInputStream fileInputStream = new FileInputStream(file); byte[] bytes = new byte[(int) file.length()]; fileInputStream.read(bytes); fileInputStream.close(); URL url = new URL("some path"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); OutputStream outputStream = connection.getOutputStream(); int bufferLength = 1024; for (int i = 0; i < bytes.length; i += bufferLength) { int progress = (int)((i / (float) bytes.length) * 100); publishProgress(progress); if (bytes.length - i >= bufferLength) { outputStream.write(bytes, i, bufferLength); } else { outputStream.write(bytes, i, bytes.length - i); } } publishProgress(100); outputStream.close(); outputStream.flush(); InputStream inputStream = connection.getInputStream(); // read the response inputStream.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } @Override protected void onProgressUpdate(Integer... progress) { dialog.setProgress(progress[0]); } @Override protected void onPostExecute(Void result) { try { dialog.dismiss(); } catch(Exception e) { } } } 

No creo que HttpURLConnection simplemente hace el truco, como @Basbous señaló, los datos reales se bufferred hasta que se llama outputStream.flush (). De acuerdo con la edición android 3164 , ahora se ha corregido en la plataforma post-froyo (android 2.2, sdk versión 8), se necesita usar – java.net.HttpURLConnection.setFixedLengthStreamingMode para evitar el comportamiento del búfer.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.