studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android android-asynctask progressdialog

android - programacion - Cómo agregar ProgressDialog



manual de programacion android pdf (4)

Usa este simple código @sachin

public class DownloadFile extends AsyncTask<Void, Void, Void> { Home home; ProgressDialog dialog = null; public DownloadFile(Home home) { // TODO Auto-generated constructor stub this.home = home; } @Override protected Void doInBackground(Void... params) { // TODO Auto-generated method stub //Call hare method for download return null; } @Override protected void onPostExecute(Void result) { // TODO Auto-generated method stub super.onPostExecute(result); dialog.dismiss(); } @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); dialog = ProgressDialog.show(home, "Downloading......", "", true); } }

Estoy descargando un archivo de Dropbox, que está demorando unos segundos. Quiero agregar un ProgressDialog para la descarga, pero no sé cómo hacerlo.

public class DownloadFile extends AsyncTask<Void, Long, Boolean> { DownloadFile(Context context ,DropboxAPI<?> mApi ,String dropboxpath,String sdpath,int pos,int s,ArrayList<String> folder) throws DropboxException { FileOutputStream mFos; File file=new File(sdpath); String path = dropboxpath; try{ mFos = new FileOutputStream(file); mApi.getFile(path, null, mFos, null); }catch (Exception e) { // TODO: handle exception } } @Override protected Boolean doInBackground(Void... params) { // TODO Auto-generated method stub return null; } }


Este artículo puede ser útil para ti:

http://huuah.com/android-progress-bar-and-thread-updating/

Donde dentro del método run () de su hilo puede invocar una función como esta:

public boolean download(String url, String path, String fileName, Handler progressHandler) { try { URL sourceUrl = new URL(formatUrl(url)); if (fileName == null || fileName.length() <= 0) { fileName = sourceUrl.getFile(); } if (fileName == null || fileName.length() <= 0) { throw new Exception("EMPTY_FILENAME_NOT_ALLOWED"); } File targetPath = new File(path); targetPath.mkdirs(); if (!targetPath.exists()) { throw new Exception("MISSING_TARGET_PATH"); } File file = new File(targetPath, fileName); URLConnection ucon = sourceUrl.openConnection(); InputStream is = ucon.getInputStream(); BufferedInputStream bis = new BufferedInputStream(is); ByteArrayBuffer baf = new ByteArrayBuffer(100); int current = 0; int totalSize = ucon.getContentLength(); while ((current = bis.read()) != -1) { baf.append((byte) current); // BEGIN - Handler feedback if (progressHandler != null && (baf.length() % 100) == 0) { Message msg = progressHandler.obtainMessage(); Bundle b = new Bundle(); if (totalSize > 0) { b.putInt("total", totalSize); b.putInt("step", baf.length()); b.putBoolean("working", true); } msg.setData(b); progressHandler.handleMessage(msg); } // END } FileOutputStream fos = new FileOutputStream(file); fos.write(baf.toByteArray()); fos.close(); // BEGIN - Handler feedback if (progressHandler != null) { Message msg = progressHandler.obtainMessage(); Bundle b = new Bundle(); if (totalSize > 0) { b.putInt("total", 0); b.putInt("step", 0); b.putBoolean("working", false); } msg.setData(b); progressHandler.handleMessage(msg); } // END return file.exists(); }

De esta manera, tiene una retroalimentación más precisa sobre el progreso real de la descarga (byte por byte).


Hacerlo de esta forma:

public final class DownloadFile extends AsyncTask<Void, Long, Boolean> { private Context context; private ProgressDialog progressDialog; public DownloadFile (Context context) { this.context = context; } /* * @see android.os.AsyncTask#onPreExecute() */ @Override protected void onPreExecute() { try { progressDialog = ProgressDialog.show(context, "", "message", true); } catch (final Throwable th) { //TODO } } /* * @see android.os.AsyncTask#doInBackground(Params[]) */ @Override protected Boolean doInBackground(Void... arg0) { //do something } @Override protected void onProgressUpdate(String... progress) { //do something super.onProgressUpdate(progress); } /* * @see android.os.AsyncTask#onPostExecute(java.lang.Object) */ @Override protected void onPostExecute(Boolean result) { progressDialog.dismiss(); } }


Ver que en realidad hay 4 métodos de AsyncTask:

  1. onPreExecute() : aquí puede realizar algunas tareas de ejecución previa.
  2. doInBackground() : aquí puede realizar algunos trabajos en segundo plano.
  3. onPostExecute() : aquí puede realizar la tarea de ejecución. Significa mostrar datos en ListView, actualizar TextView, etc.
  4. onProgressUpdate() : para actualizar la IU mientras se está onProgressUpdate() operación en segundo plano.

Entonces, en su caso, puede mostrar el diálogo de progreso o la barra de progreso dentro del método onPreExecute() de AsyncTask y descartar (() el mismo dentro onPostExecute() .