При 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 ничего не происходит. Где его надо запустить и потом выключить?
немного извращенный вариант - набросал "на коленке":
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 скрин работы кода с логированием -
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Возможно ли в Hibernate такое: При получении Entity из БД выбирать не все поля а только некоторые, чтобы снизить нагрузку на базу? Например, при логине...
Есть сервис такого типа, который запускается каждый раз при открытии приложения:
У голосового сообщения есть массив значений для визуализации, нужно сделать эту визуализациюКак это лучше сделать? Пример массива: