with studio progressbar from example asynctask java android download android-asynctask

java - studio - progressdialog android asynctask



Descarga un archivo con Android y muestra el progreso en un ProgressDialog (12)

¡No olvides agregar permisos a tu archivo de manifiesto si vas a descargar cosas de Internet!

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.helloandroid" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="10" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <uses-permission android:name="android.permission.INTERNET"></uses-permission> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission> <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true"> </application> </manifest>

Estoy tratando de escribir una aplicación sencilla que se actualiza. Para esto necesito una función simple que pueda descargar un archivo y mostrar el progreso actual en un ProgressDialog . Sé cómo hacer el ProgressDialog , pero no estoy seguro de cómo mostrar el progreso actual y cómo descargar el archivo en primer lugar.


Cuando estaba empezando a aprender sobre el desarrollo de Android, había aprendido que ProgressDialog es el camino a seguir. Existe el método setProgress de ProgressDialog que se puede invocar para actualizar el nivel de progreso a medida que se descarga el archivo.

Lo mejor que he visto en muchas aplicaciones es que personalizan los atributos de este diálogo de progreso para darle una mejor apariencia al diálogo de progreso que a la versión estándar. Bueno para mantener al usuario comprometido con alguna animación de como rana, elefante o lindos gatos / cachorros. Cualquier animación en el cuadro de diálogo de progreso atrae a los usuarios y no se siente como si estuvieran esperando mucho tiempo.

Escribiré una publicación de blog en ProgressDialog y la compartiré aquí pronto.

Edición: Mostrar barra de progreso al descargar un archivo en Android


Encontré this publicación de blog muy útil, usar loopJ para descargar el archivo, tiene solo una función simple, será útil para algunos nuevos usuarios de Android.


Estoy agregando otra respuesta para otra solución que estoy usando ahora porque Android Query es muy grande y no se mantiene para mantenerse saludable. Así que me mudé a este https://github.com/amitshekhariitbhu/Fast-Android-Networking .

AndroidNetworking.download(url,dirPath,fileName).build() .setDownloadProgressListener(new DownloadProgressListener() { public void onProgress(long bytesDownloaded, long totalBytes) { bar.setMax((int) totalBytes); bar.setProgress((int) bytesDownloaded); } }).startDownload(new DownloadListener() { public void onDownloadComplete() { ... } public void onError(ANError error) { ... } });


Hay muchas maneras de descargar archivos. A continuación voy a publicar las formas más comunes; depende de usted decidir qué método es mejor para su aplicación.

1. Use AsyncTask y muestre el progreso de la descarga en un diálogo

Este método le permitirá ejecutar algunos procesos en segundo plano y actualizar la interfaz de usuario al mismo tiempo (en este caso, actualizaremos una barra de progreso).

Este es un código de ejemplo:

// declare the dialog as a member field of your activity ProgressDialog mProgressDialog; // instantiate it within the onCreate method mProgressDialog = new ProgressDialog(YourActivity.this); mProgressDialog.setMessage("A message"); mProgressDialog.setIndeterminate(true); mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); mProgressDialog.setCancelable(true); // execute this when the downloader must be fired final DownloadTask downloadTask = new DownloadTask(YourActivity.this); downloadTask.execute("the url to the file you want to download"); mProgressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { downloadTask.cancel(true); } });

La AsyncTask se verá así:

// usually, subclasses of AsyncTask are declared inside the activity class. // that way, you can easily modify the UI thread from here private class DownloadTask extends AsyncTask<String, Integer, String> { private Context context; private PowerManager.WakeLock mWakeLock; public DownloadTask(Context context) { this.context = context; } @Override protected String doInBackground(String... sUrl) { InputStream input = null; OutputStream output = null; HttpURLConnection connection = null; try { URL url = new URL(sUrl[0]); connection = (HttpURLConnection) url.openConnection(); connection.connect(); // expect HTTP 200 OK, so we don''t mistakenly save error report // instead of the file if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) { return "Server returned HTTP " + connection.getResponseCode() + " " + connection.getResponseMessage(); } // this will be useful to display download percentage // might be -1: server did not report the length int fileLength = connection.getContentLength(); // download the file input = connection.getInputStream(); output = new FileOutputStream("/sdcard/file_name.extension"); byte data[] = new byte[4096]; long total = 0; int count; while ((count = input.read(data)) != -1) { // allow canceling with back button if (isCancelled()) { input.close(); return null; } total += count; // publishing the progress.... if (fileLength > 0) // only if total length is known publishProgress((int) (total * 100 / fileLength)); output.write(data, 0, count); } } catch (Exception e) { return e.toString(); } finally { try { if (output != null) output.close(); if (input != null) input.close(); } catch (IOException ignored) { } if (connection != null) connection.disconnect(); } return null; }

El método anterior ( doInBackground ) se ejecuta siempre en un hilo de fondo. No deberías hacer ninguna tarea de UI allí. Por otro lado, onProgressUpdate y onPreExecute ejecutan en el subproceso de la interfaz de usuario, de modo que allí puede cambiar la barra de progreso:

@Override protected void onPreExecute() { super.onPreExecute(); // take CPU lock to prevent CPU from going off if the user // presses the power button during download PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, getClass().getName()); mWakeLock.acquire(); mProgressDialog.show(); } @Override protected void onProgressUpdate(Integer... progress) { super.onProgressUpdate(progress); // if we get here, length is known, now set indeterminate to false mProgressDialog.setIndeterminate(false); mProgressDialog.setMax(100); mProgressDialog.setProgress(progress[0]); } @Override protected void onPostExecute(String result) { mWakeLock.release(); mProgressDialog.dismiss(); if (result != null) Toast.makeText(context,"Download error: "+result, Toast.LENGTH_LONG).show(); else Toast.makeText(context,"File downloaded", Toast.LENGTH_SHORT).show(); }

Para que esto se ejecute, necesita el permiso WAKE_LOCK.

<uses-permission android:name="android.permission.WAKE_LOCK" />

2. Descargar desde el servicio

La gran pregunta aquí es: ¿cómo actualizo mi actividad desde un servicio? . En el siguiente ejemplo, usaremos dos clases de las que tal vez no esté al tanto: ResultReceiver e IntentService . ResultReceiver es el que nos permitirá actualizar nuestro hilo desde un servicio; IntentService es una subclase de Service que genera un subproceso para hacer un trabajo en segundo plano desde allí (debe saber que un Service ejecuta realmente en el mismo subproceso de su aplicación; cuando extiende el Service , debe generar manualmente nuevos subprocesos para ejecutar las operaciones de bloqueo de la CPU) .

El servicio de descarga puede verse así:

public class DownloadService extends IntentService { public static final int UPDATE_PROGRESS = 8344; public DownloadService() { super("DownloadService"); } @Override protected void onHandleIntent(Intent intent) { String urlToDownload = intent.getStringExtra("url"); ResultReceiver receiver = (ResultReceiver) intent.getParcelableExtra("receiver"); try { URL url = new URL(urlToDownload); URLConnection connection = url.openConnection(); connection.connect(); // this will be useful so that you can show a typical 0-100% progress bar int fileLength = connection.getContentLength(); // download the file InputStream input = new BufferedInputStream(connection.getInputStream()); OutputStream output = new FileOutputStream("/sdcard/BarcodeScanner-debug.apk"); byte data[] = new byte[1024]; long total = 0; int count; while ((count = input.read(data)) != -1) { total += count; // publishing the progress.... Bundle resultData = new Bundle(); resultData.putInt("progress" ,(int) (total * 100 / fileLength)); receiver.send(UPDATE_PROGRESS, resultData); output.write(data, 0, count); } output.flush(); output.close(); input.close(); } catch (IOException e) { e.printStackTrace(); } Bundle resultData = new Bundle(); resultData.putInt("progress" ,100); receiver.send(UPDATE_PROGRESS, resultData); } }

Agrega el servicio a tu manifiesto:

<service android:name=".DownloadService"/>

Y la actividad se verá así:

// initialize the progress dialog like in the first example // this is how you fire the downloader mProgressDialog.show(); Intent intent = new Intent(this, DownloadService.class); intent.putExtra("url", "url of the file to download"); intent.putExtra("receiver", new DownloadReceiver(new Handler())); startService(intent);

Aquí es donde ResultReceiver viene a jugar:

private class DownloadReceiver extends ResultReceiver{ public DownloadReceiver(Handler handler) { super(handler); } @Override protected void onReceiveResult(int resultCode, Bundle resultData) { super.onReceiveResult(resultCode, resultData); if (resultCode == DownloadService.UPDATE_PROGRESS) { int progress = resultData.getInt("progress"); mProgressDialog.setProgress(progress); if (progress == 100) { mProgressDialog.dismiss(); } } } }

2.1 Usar la biblioteca de Groundy

Groundy es una biblioteca que básicamente le ayuda a ejecutar fragmentos de código en un servicio en segundo plano, y se basa en el concepto ResultReceiver muestra arriba Esta biblioteca está en desuso en este momento. Así es como se vería todo el código:

La actividad donde se muestra el diálogo ...

public class MainActivity extends Activity { private ProgressDialog mProgressDialog; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); findViewById(R.id.btn_download).setOnClickListener(new View.OnClickListener() { public void onClick(View view) { String url = ((EditText) findViewById(R.id.edit_url)).getText().toString().trim(); Bundle extras = new Bundler().add(DownloadTask.PARAM_URL, url).build(); Groundy.create(DownloadExample.this, DownloadTask.class) .receiver(mReceiver) .params(extras) .queue(); mProgressDialog = new ProgressDialog(MainActivity.this); mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); mProgressDialog.setCancelable(false); mProgressDialog.show(); } }); } private ResultReceiver mReceiver = new ResultReceiver(new Handler()) { @Override protected void onReceiveResult(int resultCode, Bundle resultData) { super.onReceiveResult(resultCode, resultData); switch (resultCode) { case Groundy.STATUS_PROGRESS: mProgressDialog.setProgress(resultData.getInt(Groundy.KEY_PROGRESS)); break; case Groundy.STATUS_FINISHED: Toast.makeText(DownloadExample.this, R.string.file_downloaded, Toast.LENGTH_LONG); mProgressDialog.dismiss(); break; case Groundy.STATUS_ERROR: Toast.makeText(DownloadExample.this, resultData.getString(Groundy.KEY_ERROR), Toast.LENGTH_LONG).show(); mProgressDialog.dismiss(); break; } } }; }

Una implementación de GroundyTask utilizada por Groundy para descargar el archivo y mostrar el progreso:

public class DownloadTask extends GroundyTask { public static final String PARAM_URL = "com.groundy.sample.param.url"; @Override protected boolean doInBackground() { try { String url = getParameters().getString(PARAM_URL); File dest = new File(getContext().getFilesDir(), new File(url).getName()); DownloadUtils.downloadFile(getContext(), url, dest, DownloadUtils.getDownloadListenerForTask(this)); return true; } catch (Exception pokemon) { return false; } } }

Y solo agrega esto al manifiesto:

<service android:name="com.codeslap.groundy.GroundyService"/>

No podría ser más fácil, creo. Solo toma el último frasco de Github y estás listo para ir. Tenga en cuenta que el propósito principal de Groundy es hacer llamadas a API REST externas en un servicio en segundo plano y publicar los resultados en la interfaz de usuario fácilmente. Si estás haciendo algo así en tu aplicación, podría ser realmente útil.

2.2 Utilice https://github.com/koush/ion

3. Usa la clase DownloadManager (solo GingerBread y más reciente)

GingerBread trajo una nueva característica, DownloadManager , que le permite descargar archivos fácilmente y delegar el trabajo duro de manejar subprocesos, secuencias, etc. al sistema.

Primero, veamos un método de utilidad:

/** * @param context used to check the device version and DownloadManager information * @return true if the download manager is available */ public static boolean isDownloadManagerAvailable(Context context) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { return true; } return false; }

El nombre del método lo explica todo. Una vez que esté seguro de que DownloadManager está disponible, puede hacer algo como esto:

String url = "url you want to download"; DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); request.setDescription("Some descrition"); request.setTitle("Some title"); // in order for this if to run, you must use the android 3.2 to compile your app if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { request.allowScanningByMediaScanner(); request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); } request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "name-of-the-file.ext"); // get download service and enqueue file DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); manager.enqueue(request);

El progreso de la descarga se mostrará en la barra de notificaciones.

Pensamientos finales

El primer y segundo método son solo la punta del iceberg. Hay muchas cosas que debes tener en cuenta si quieres que tu aplicación sea robusta. Aquí hay una breve lista:

  • Debe comprobar si el usuario tiene una conexión a internet disponible
  • Asegúrese de tener los permisos correctos ( INTERNET y WRITE_EXTERNAL_STORAGE ); también ACCESS_NETWORK_STATE si desea verificar la disponibilidad de Internet.
  • Asegúrese de que el directorio en el que va a descargar los archivos existen y tiene permisos de escritura.
  • Si la descarga es demasiado grande, es posible que desee implementar una forma de reanudar la descarga si los intentos anteriores fallaron.
  • Los usuarios se lo agradecerán si les permite interrumpir la descarga.

A menos que necesite un control detallado del proceso de descarga, considere usar DownloadManager (3) porque ya maneja la mayoría de los elementos enumerados anteriormente.

Pero también considera que tus necesidades pueden cambiar. Por ejemplo, DownloadManager no realiza el almacenamiento en caché de respuestas . Se descargará a ciegas el mismo archivo grande varias veces. No hay una manera fácil de arreglarlo después del hecho. Donde si comienzas con un HttpURLConnection básico (1, 2), todo lo que necesitas es agregar un HttpResponseCache . Entonces, el esfuerzo inicial de aprender las herramientas básicas y estándar puede ser una buena inversión.

Esta clase está en desuso en el nivel 26 de API. ProgressDialog es un diálogo modal, que evita que el usuario interactúe con la aplicación. En lugar de usar esta clase, debes usar un indicador de progreso como ProgressBar, que se puede incrustar en la interfaz de usuario de tu aplicación. Alternativamente, puede usar una notificación para informar al usuario del progreso de la tarea. Para más detalles Link


He modificado la clase AsyncTask para manejar la creación de progressDialog en el mismo contexto. Creo que el siguiente código será más reutilizable. (Se puede llamar desde cualquier actividad, solo pase el contexto, el archivo de destino, el mensaje de diálogo)

public static class DownloadTask extends AsyncTask<String, Integer, String> { private ProgressDialog mPDialog; private Context mContext; private PowerManager.WakeLock mWakeLock; private File mTargetFile; //Constructor parameters : // @context (current Activity) // @targetFile (File object to write,it will be overwritten if exist) // @dialogMessage (message of the ProgresDialog) public DownloadTask(Context context,File targetFile,String dialogMessage) { this.mContext = context; this.mTargetFile = targetFile; mPDialog = new ProgressDialog(context); mPDialog.setMessage(dialogMessage); mPDialog.setIndeterminate(true); mPDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); mPDialog.setCancelable(true); // reference to instance to use inside listener final DownloadTask me = this; mPDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { me.cancel(true); } }); Log.i("DownloadTask","Constructor done"); } @Override protected String doInBackground(String... sUrl) { InputStream input = null; OutputStream output = null; HttpURLConnection connection = null; try { URL url = new URL(sUrl[0]); connection = (HttpURLConnection) url.openConnection(); connection.connect(); // expect HTTP 200 OK, so we don''t mistakenly save error report // instead of the file if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) { return "Server returned HTTP " + connection.getResponseCode() + " " + connection.getResponseMessage(); } Log.i("DownloadTask","Response " + connection.getResponseCode()); // this will be useful to display download percentage // might be -1: server did not report the length int fileLength = connection.getContentLength(); // download the file input = connection.getInputStream(); output = new FileOutputStream(mTargetFile,false); byte data[] = new byte[4096]; long total = 0; int count; while ((count = input.read(data)) != -1) { // allow canceling with back button if (isCancelled()) { Log.i("DownloadTask","Cancelled"); input.close(); return null; } total += count; // publishing the progress.... if (fileLength > 0) // only if total length is known publishProgress((int) (total * 100 / fileLength)); output.write(data, 0, count); } } catch (Exception e) { return e.toString(); } finally { try { if (output != null) output.close(); if (input != null) input.close(); } catch (IOException ignored) { } if (connection != null) connection.disconnect(); } return null; } @Override protected void onPreExecute() { super.onPreExecute(); // take CPU lock to prevent CPU from going off if the user // presses the power button during download PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, getClass().getName()); mWakeLock.acquire(); mPDialog.show(); } @Override protected void onProgressUpdate(Integer... progress) { super.onProgressUpdate(progress); // if we get here, length is known, now set indeterminate to false mPDialog.setIndeterminate(false); mPDialog.setMax(100); mPDialog.setProgress(progress[0]); } @Override protected void onPostExecute(String result) { Log.i("DownloadTask", "Work Done! PostExecute"); mWakeLock.release(); mPDialog.dismiss(); if (result != null) Toast.makeText(mContext,"Download error: "+result, Toast.LENGTH_LONG).show(); else Toast.makeText(mContext,"File Downloaded", Toast.LENGTH_SHORT).show(); } }


Mi consejo personal es usar el Diálogo de progreso y compilar antes de la ejecución, o iniciarlo en OnPreExecute() , publicar el progreso a menudo si usa el estilo horizontal de la barra de progreso del diálogo de progreso. La parte restante es optimizar el algoritmo de doInBackground .


No olvide reemplazar "/ sdcard ..." por un nuevo archivo ("/ mnt / sdcard / ..."), de lo contrario obtendrá una excepción FileNotFoundException


Sí, el código anterior funcionará. Pero si está actualizando su onProgressUpdate de progressbar en el onProgressUpdate of Asynctask y presiona el botón Atrás o finaliza su actividad, AsyncTask pierde su pista con su interfaz de usuario. Y cuando vuelve a su actividad, incluso si la descarga se está ejecutando fondo verá ninguna actualización en la barra de progreso. Así que en OnResume() intente ejecutar un hilo como runOnUIThread con una tarea de temporizador que actualiza su barra de progressbar con los valores que se actualizan desde el fondo de ejecución AsyncTask .

private void updateProgressBar(){ Runnable runnable = new updateProgress(); background = new Thread(runnable); background.start(); } public class updateProgress implements Runnable { public void run() { while(Thread.currentThread()==background) //while (!Thread.currentThread().isInterrupted()) { try { Thread.sleep(1000); Message msg = new Message(); progress = getProgressPercentage(); handler.sendMessage(msg); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } catch (Exception e) { } } } private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { progress.setProgress(msg.what); } };

No te olvides de Destruir el hilo cuando tu actividad no sea visible.

private void destroyRunningThreads() { if (background != null) { background.interrupt(); background=null; } }


Te recomiendo que uses mi Project Netroid , está basado en Volley . Le he agregado algunas funciones, como la devolución de llamadas de eventos múltiples, la administración de descargas de archivos. Esto podría ser de alguna ayuda.


Use la biblioteca de Android Query, realmente genial. Puede cambiarla para usar ProgressDialog como se ve en otros ejemplos, esta mostrará la vista de progreso de su diseño y la ocultará una vez finalizada.

File target = new File(new File(Environment.getExternalStorageDirectory(), "ApplicationName"), "tmp.pdf"); new AQuery(this).progress(R.id.progress_view).download(_competition.qualificationScoreCardsPdf(), target, new AjaxCallback<File>() { public void callback(String url, File file, AjaxStatus status) { if (file != null) { // do something with file } } });


Permisos

<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Utilizando HttpURLConnection

import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import android.app.Activity; import android.app.Dialog; import android.os.Bundle; import android.os.Environment; import android.view.View; import android.view.Window; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; public class DownloadFileUseHttpURLConnection extends Activity { ProgressBar pb; Dialog dialog; int downloadedSize = 0; int totalSize = 0; TextView cur_val; String dwnload_file_path = "http://coderzheaven.com/sample_folder/sample_file.png"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button b = (Button) findViewById(R.id.b1); b.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { showProgress(dwnload_file_path); new Thread(new Runnable() { public void run() { downloadFile(); } }).start(); } }); } void downloadFile(){ try { URL url = new URL(dwnload_file_path); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setRequestMethod("GET"); urlConnection.setDoOutput(true); //connect urlConnection.connect(); //set the path where we want to save the file File SDCardRoot = Environment.getExternalStorageDirectory(); //create a new file, to save the downloaded file File file = new File(SDCardRoot,"downloaded_file.png"); FileOutputStream fileOutput = new FileOutputStream(file); //Stream used for reading the data from the internet InputStream inputStream = urlConnection.getInputStream(); //this is the total size of the file which we are downloading totalSize = urlConnection.getContentLength(); runOnUiThread(new Runnable() { public void run() { pb.setMax(totalSize); } }); //create a buffer... byte[] buffer = new byte[1024]; int bufferLength = 0; while ( (bufferLength = inputStream.read(buffer)) > 0 ) { fileOutput.write(buffer, 0, bufferLength); downloadedSize += bufferLength; // update the progressbar // runOnUiThread(new Runnable() { public void run() { pb.setProgress(downloadedSize); float per = ((float)downloadedSize/totalSize) * 100; cur_val.setText("Downloaded " + downloadedSize + "KB / " + totalSize + "KB (" + (int)per + "%)" ); } }); } //close the output stream when complete // fileOutput.close(); runOnUiThread(new Runnable() { public void run() { // pb.dismiss(); // if you want close it.. } }); } catch (final MalformedURLException e) { showError("Error : MalformedURLException " + e); e.printStackTrace(); } catch (final IOException e) { showError("Error : IOException " + e); e.printStackTrace(); } catch (final Exception e) { showError("Error : Please check your internet connection " + e); } } void showError(final String err){ runOnUiThread(new Runnable() { public void run() { Toast.makeText(DownloadFileDemo1.this, err, Toast.LENGTH_LONG).show(); } }); } void showProgress(String file_path){ dialog = new Dialog(DownloadFileDemo1.this); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(R.layout.myprogressdialog); dialog.setTitle("Download Progress"); TextView text = (TextView) dialog.findViewById(R.id.tv1); text.setText("Downloading file from ... " + file_path); cur_val = (TextView) dialog.findViewById(R.id.cur_pg_tv); cur_val.setText("Starting download..."); dialog.show(); pb = (ProgressBar)dialog.findViewById(R.id.progress_bar); pb.setProgress(0); pb.setProgressDrawable( getResources().getDrawable(R.drawable.green_progress)); } }