Лучший способ, которым я знаю, это сделать с помощью асинхронной задачи. Так как это позволит вам выполнять некоторую фоновую работу и обновлять пользовательский интерфейс одновременно (в вашем случае, индикатор выполнения).
Это пример кода того, как я могу это сделать ..
ProgressDialog mProgressDialog = new ProgressDialog(YourActivity.this);
mProgressDialog.setMessage("A message");
mProgressDialog.setIndeterminate(false);
mProgressDialog.setMax(100);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
DownloadFile downloadFile = new DownloadFile();
downloadFile.execute("the url to the file you want to download");
Это пример того, как будет выглядеть ваша AsyncTask.
private class DownloadFile extends AsyncTask<String, Integer, String>{
@Override
protected String doInBackground(String... url) {
int count;
try {
URL url = new URL(url[0]);
URLConnection conexion = url.openConnection();
conexion.connect();
// this will be useful so that you can show a tipical 0-100% progress bar
int lenghtOfFile = conexion.getContentLength();
// download the file
InputStream input = new BufferedInputStream(url.openStream());
OutputStream output = new FileOutputStream("/sdcard/somewhere/nameofthefile.ext");
byte data[] = new byte[1024];
long total = 0;
while ((count = input.read(data)) != -1) {
total += count;
// publishing the progress....
publishProgress((int)(total*100/lenghtOfFile));
output.write(data, 0, count);
}
output.flush();
output.close();
input.close();
} catch (Exception e) {}
return null;
}
Метод, описанный выше, ВСЕГДА работает в фоновом режиме, и вы не должны обновлять любой пользовательский интерфейс оттуда.
С другой стороны, onProgressUpdate выполняется в потоке пользовательского интерфейса, поэтому вы измените индикатор выполнения:
@Override
public void onProgressUpdate(String... args){
// here you will have to update the progressbar
// with something like
mProgressDialog.setProgress(args[0]);
}
}
Вы также захотите переопределить метод onPostExecute, если хотите выполнить какой-либо код после полной загрузки файла.