Android: Фоновая тема в классе Singleton - PullRequest
2 голосов
/ 25 ноября 2011

У меня есть класс 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: Мне нужно обновлять пользовательский интерфейс через каждую секунду, поэтому я запускаю отдельный поток, который может изменить данные и вызвать обновление пользовательского интерфейса.

...