Загрузите файл с Android и покажите прогресс в ProgressDialog

Я пытаюсь написать простое приложение, которое обновляется. Для этого мне нужна простая функция, которая может загрузить файл и показать текущий прогресс в ProgressDialog . Я знаю, как делать ProgressDialog , но я не уверен, как отобразить текущий прогресс и как загрузить файл в первую очередь.

Solutions Collecting From Web of "Загрузите файл с Android и покажите прогресс в ProgressDialog"

Существует множество способов загрузки файлов. После того, как я опубликую наиболее распространенные способы; Вам решать, какой метод лучше для вашего приложения.

1. Используйте AsyncTask и покажите ход загрузки в диалоговом окне

Этот метод позволит вам выполнить некоторые фоновые процессы и одновременно обновить интерфейс (в этом случае мы обновим индикатор выполнения).

Это пример кода:

 // 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); } }); 

AsyncTask будет выглядеть так:

 // 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; } 

Метод выше ( doInBackground ) работает всегда в фоновом потоке. Вы не должны выполнять какие-либо задачи пользовательского интерфейса. С другой стороны, onProgressUpdate и onPreExecute работают в потоке пользовательского интерфейса, поэтому вы можете изменить индикатор выполнения:

  @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(); } 

Для этого вам нужно разрешение WAKE_LOCK.

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

2. Загрузить с сервисов

Большой вопрос здесь: как мне обновить свою деятельность от службы? , В следующем примере мы собираемся использовать два класса, о которых вы не можете знать: ResultReceiver и IntentService . ResultReceiver – это тот, который позволит нам обновить наш поток от службы; IntentService – это подкласс Service который генерирует поток для выполнения фоновой работы (вы должны знать, что Service работает фактически в том же потоке вашего приложения, когда вы расширяете Service , вы должны вручную создавать новые потоки для выполнения операций блокировки ЦП) ,

Сервис загрузки может выглядеть так:

 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); } } Сервис 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); } } 

Добавьте службу в свой манифест:

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

И действие будет выглядеть так:

 // 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); 

Вот как ResultReceiver :

 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 Использование Groundy library

Groundy – это библиотека, которая в основном помогает вам запускать фрагменты кода в фоновом режиме и основана на концепции ResultReceiver показанной выше. В настоящий момент эта библиотека устарела . Так будет выглядеть весь код:

Активность, в которой вы показываете диалог …

 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; } } }; } 

Реализация GroundyTask используемая Groundy для загрузки файла и отображения прогресса:

 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; } } } 

И просто добавьте это в манифест:

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

Думаю, это нелегко. Просто возьмите последнюю банку из Github, и вы готовы к работе. Имейте в виду, что основная цель Groundy – совершать вызовы на внешний REST apis в фоновом режиме и легко отправлять результаты в пользовательский интерфейс. Если вы делаете что-то подобное в своем приложении, это может быть очень полезно.

2.2. Используйте https://github.com/koush/ion

3. Используйте класс DownloadManager (только GingerBread и новее)

GingerBread принес новую функцию DownloadManager , которая позволяет легко загружать файлы и делегировать тяжелую работу по обработке потоков, потоков и т. Д. В систему.

Сначала рассмотрим утилиту:

 /** * @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; } 

Имя метода объясняет все это. Как только вы убедитесь, что DownloadManager доступен, вы можете сделать что-то вроде этого:

 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); 

Прогресс загрузки будет отображаться в панели уведомлений.

Последние мысли

Первый и второй методы – только верхушка айсберга. Есть много вещей, которые вы должны иметь в виду, если хотите, чтобы ваше приложение было надежным. Вот краткий список:

  • Вы должны проверить, есть ли у пользователя доступ к Интернету
  • Убедитесь, что у вас есть права ( INTERNET и WRITE_EXTERNAL_STORAGE ); Также ACCESS_NETWORK_STATE если вы хотите проверить доступность Интернета.
  • Убедитесь, что в каталоге вы собираетесь загружать файлы и имеете разрешения на запись.
  • Если загрузка слишком велика, вы можете захотеть реализовать способ возобновить загрузку, если предыдущие попытки не удались.
  • Пользователи будут благодарны, если вы разрешите им прервать загрузку.

Если вам не нужен подробный контроль процесса загрузки, рассмотрите возможность использования DownloadManager (3), поскольку он уже обрабатывает большинство элементов, перечисленных выше.

Но также подумайте, что ваши потребности могут измениться. Например, DownloadManager не выполняет кэширование ответов . Он будет слепо загружать один и тот же большой файл несколько раз. Нет простого способа исправить это после факта. Если вы начинаете с базового HttpURLConnection (1, 2), тогда вам нужно только добавить HttpResponseCache . Поэтому первоначальные усилия по изучению основных стандартных инструментов могут быть хорошей инвестицией.

Не забудьте добавить разрешения в файл манифеста, если вы собираетесь загружать файлы из Интернета!

 <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> ? <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> 

Да, код выше будет работать. Но если вы обновляете свою onProgressUpdate progressbar в onProgressUpdate из Asynctask и вы нажимаете кнопку «Назад» или заканчиваете свою деятельность. AsyncTask теряет свой трек с вашим пользовательским интерфейсом. И когда вы возвращаетесь к своей активности, даже если загрузка выполняется в В фоновом режиме вы не увидите обновления на панели прогресса. Итак, OnResume() попытается запустить поток, такой как runOnUIThread с задачей таймера, которая обновляет панель progressbar ur со значениями, обновляемыми из AsyncTask фона 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); } }; в 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); } }; 

Не забывайте уничтожать нить, когда активность ur не видна.

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

Я изменил класс AsyncTask чтобы обработать создание progressDialog в том же контексте. Я думаю, что следующий код будет более многоразовым. (Его можно вызывать из любой активности, просто передающей контекст, целевой файл, диалоговое сообщение)

 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(); } } 

Я бы порекомендовал вам использовать мой проект Netroid , он основан на Volley, в котором представлена ​​презентация Google IO 2013, я расширяю ее, добавляю некоторые функции, такие как обратный вызов с несколькими событиями, управление загрузкой файлов, я думаю, это то, что вы ищете.

Не забудьте заменить «/ sdcard …» на новый файл («/ mnt / sdcard / …»), иначе вы получите исключение FileNotFoundException

Я нашел это сообщение в блоге очень полезным, его использование loopJ для загрузки файла, оно имеет только одну простую функцию, будет полезно для некоторых новых парней Android.

Мой личный совет заключается в том, чтобы использовать Диалоговое окно « Прогресс» и создавать его перед выполнением или инициировать OnPreExecute() , часто OnPreExecute() прогресс, если вы используете горизонтальный стиль индикатора выполнения диалога прогресса. Остальная часть – оптимизировать алгоритм doInBackground .

Пока я начинал изучать развитие Android, я узнал, что ProgressDialog – это путь. Существует метод setProgress для ProgressDialog который можно вызвать для обновления уровня прогресса по мере загрузки файла.

Лучшее, что я видел во многих приложениях, – это то, что они настраивают атрибуты этого диалога прогресса, чтобы лучше видеть и видеть диалог прогресса, чем версия запаса. Хорошо, чтобы пользователь работал с некоторой анимацией, как лягушка, слон или симпатичные кошки / щенки. Любая анимация в диалоге прогресса привлекает пользователей, и им не хочется долго ждать.

Я напишу сообщение в блоге о ProgressDialog и поделитесь им в ближайшее время.

Изменить: показать строку выполнения при загрузке файла в android

Используйте библиотеку Android Query, очень классно. Вы можете изменить ее, чтобы использовать ProgressDialog как вы видите в других примерах, этот покажет представление прогресса из вашего макета и спрячет его после завершения.

 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 } } }); 

права доступа

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

Использование 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)); } }