Прогресс бар для большого количества изображений - PullRequest
0 голосов
/ 11 декабря 2011

Я создаю приложение, которое загружает около 231 изображения, 150 из которых отображаются в виде списка, а остальные отображаются в полном размере в виде изображения в отдельном упражнении.При первом запуске приложения загружаются изображения, что занимает около 4 минут или 5 минут (мне нужен индикатор выполнения, чтобы показать, сколько картинок они скачали из общего количества), а затем после загрузки изображений они сохраняются в sd.карта.Последовательный запуск приложения будет загружать изображения с SD-карты, а не загружать их заново.

  1. Это лучший способ сделать это?
  2. Как мне сделать индикатор?Я только успешен в создании индикатора выполнения, который работает для одного изображения

1 Ответ

1 голос
/ 11 декабря 2011

Лучший способ, которым я знаю, это сделать с помощью асинхронной задачи. Так как это позволит вам выполнять некоторую фоновую работу и обновлять пользовательский интерфейс одновременно (в вашем случае, индикатор выполнения).

Это пример кода того, как я могу это сделать ..

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, если хотите выполнить какой-либо код после полной загрузки файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...