Где стартовать индикатор загрузки?

296
30 мая 2017, 00:17

При onCreate одного из Активити, происходит чтение большого файла из Assets (или с диска) и его "распарсивание". На это время хочу включить индикатор загрузки сделанный следующим образом:

ProgressDialog progressBar;
Handler progressBarHandler;  // Handler for updating progress
int progressStatus;
int cnt;
Thread pbar;
Boolean pbOn = true;
public void pb_on(String msg){
    progressBarHandler = new Handler();
    progressBar = new ProgressDialog(this);
    progressBar.setCancelable(true);
    progressBar.setMessage(msg);
    progressBar.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    progressBar.setProgress(0);
    progressBar.setMax(100);
    progressBar.show();
    progressStatus = 0;
    cnt = 0;
    //Log.d(LOG_TAG,"pb_on");
    pbar = new Thread(new Runnable() {
        public void run() {
            while (progressStatus < 100) {
                //Log.d(LOG_TAG,"pbar_work1");
                if (!pbOn) { progressStatus = 101; progressBar.dismiss(); finish();}
                else { progressStatus = PrBarCnt();}
                //try {Thread.sleep(1000);}catch (Exception e) { e.printStackTrace(); }    // pause to see progress
                progressBarHandler.post(new Runnable() {
                    public void run() { progressBar.setProgress(progressStatus); }
                });
                if (progressStatus >= 100) { progressBar.dismiss(); }
            }
        }
    });
    pbar.start();
}
// Simulator for donwloading file...
private int PrBarCnt() {
    while (cnt <= 10000000) {
        cnt++;
        try { Thread.sleep(150); } catch (Exception e) { e.printStackTrace(); }
        return cnt;
    }
    return cnt;
}

Запускаю его

if (pbOn){pb_on("Идет загрузка базы...");}

Но если его разместить в onCreate ничего не происходит. Где его надо запустить и потом выключить?

Answer 1

немного извращенный вариант - набросал "на коленке":

Handler h;
ProgressDialog progressBar;
public void onCreate(Bundle savedInstanceState) {
  ....
  // обработчик сообщений от handler
  h = new Handler() {
    public void handleMessage(android.os.Message msg) {
      switch(msg.what){
         case 200:
            // запускаем прогресс диалог
            progressDialogStart();  
         break;
         case 300:
            // закрываем прогресс диалог 
            progressDialogStop();
         break;
         default:
            // обновляем прогресс диалог - сюда принимаем прогресс
            progressDialogUpdate(int msg.what);
         break;
      }
    };
  };
  ...
  // ваш поток загрузчик-обработчик
  Thread t = new Thread(new Runnable() {
    public void run() {
      // запускаем прогресс
      h.sendEmptyMessage(200);
      ...
      // выполняем какие-то операции
      ...
      // обновляем прогресс у диалога
      h.sendEmptyMessage(25) // например у нас уже 25% выполнено
      ...
      // закрываем прогресс
      h.sendEmptyMessage(300);
      }
    }
  });
  t.start();
}

надеюсь идея и смысл понятен. на идеал в архитектуре не претендует - можно все разбросать по методам и создавать обработчик и поток выполнения в них, вызывая из onCreate (дабы разгрузить от кода метод)

UPD

ProgressDialogStart:

progressBar = new ProgressDialog(this);
progressBar.setCancelable(true);
progressBar.setMessage(msg);
progressBar.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressBar.setProgress(0);
progressBar.setMax(100);
progressBar.show();

progressDialogStop:

progressBar.dismiss();

progressDialogUpdate(int count):

progressBar.setProgress(count);

не забудьте проверить что в классе активности есть переменная progressBar типа ProgressDialog.

код позаимствован отсюда http://startandroid.ru/ru/uroki/vse-uroki-spiskom/143-urok-80-handler-nemnogo-teorii-nagljadnyj-primer-ispolzovanija.html здесь же есть много полезной теории

UPD2 скрин работы кода с логированием -

READ ALSO
Hibernate: выбирать из БД не все поля

Hibernate: выбирать из БД не все поля

Возможно ли в Hibernate такое: При получении Entity из БД выбирать не все поля а только некоторые, чтобы снизить нагрузку на базу? Например, при логине...

380
Новый поток в сервисе

Новый поток в сервисе

Есть сервис такого типа, который запускается каждый раз при открытии приложения:

262
Android визуализация голосового сообщения

Android визуализация голосового сообщения

У голосового сообщения есть массив значений для визуализации, нужно сделать эту визуализациюКак это лучше сделать? Пример массива:

226