У меня есть класс Singleton, который содержит все данные (посетители какого-либо сайта), и данные обновляются службой. У меня есть интерфейс, который реализуется действием (списком) (которое показывает посетителей), поэтому теперь, когда я обновляю данные, я просто вызываю метод интерфейса, чтобы действие списка могло его обновить.
Теперь мне нужно указать время, в течение которого посетители находятся на сайте (на стороне клиента). Я хочу создать поток в классе Singleton, который будет запускать цикл через каждую секунду, но я не могу вызвать какой-либо метод в главном потоке, используя обработчики.
Вот код темы:
void startHeavyDutyStuff() {
Thread t = new Thread() {
public void run() {
try {
while(true) {
sleep(1000);
ArrayList<VisitorMC> data = SharedAppManager.appManager().visitorsData;
boolean doReload = false;
for (VisitorMC item: data) {
item.secsOnSite++;
if(item.secsOnSite == 60) {
item.secsOnSite = 0;
item.minsOnSite++;
doReload = true;
}
}
if(doReload) {
messageHandler.sendEmptyMessage(1);
} else {
messageHandler.sendEmptyMessage(0);
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
t.start();
}
А вот код, в котором я делаю обработчик в главном потоке (в классе Singleton):
private SharedAppManager() {
//Initialization of the data.
Looper.prepare();
messageHandler = new Handler() {
public void handleMessage(Message msg) {
switch(msg.what) {
case 0:
Log.d("THREAD", "after every second");
break;
case 1:
if(visitorsDelegate != null) {
visitorsDelegate.updateVisitorsTime();
}
break;
default:
}
}
};
startHeavyDutyStuff();
}
Что я здесь не так делаю?
Edit:
Мне нужно обновлять пользовательский интерфейс через каждую секунду, поэтому я запускаю отдельный поток, который может изменить данные и вызвать обновление пользовательского интерфейса.