Как вызвать обновление пользовательского интерфейса в Activity, когда основной обработчик данных получает данные - PullRequest
1 голос
/ 06 июня 2011

Я создаю приложение, которое опирается на данные через Интернет.Эти данные являются общими для всех видов деятельности.Кроме того, данные будут обновляться, например, обновляя их каждые две или три минуты.Поэтому я создал класс обработчика данных, который должен обрабатывать все, что связано с загрузкой, анализом данных и тому подобным.Иногда он получает команду от Activity для обновления данных.

Проблема в том, как обновить пользовательский интерфейс в деятельности, когда новые данные становятся доступными в обработчике данных.Если бы обработчик данных работал, я мог бы просто опубликовать обработчик для потока пользовательского интерфейса, чтобы обновить его.Однако я не знаю, как это сделать из этого базового класса.Любой совет?

Вот примерный код для трех классов:

/**
 * The data handler class itself
 */
public class DataHandler {
   Object data;

   public void getData () {
     // starts a thread (HTTP query) to get data
   } 

   private class dataReceived (Object data) {
     // receives data
     this.data = data;       

     // TRIGGER updateUI() in MyActivity! HOW?
   }
}

/**
 * Application class. I'm planning to keep data handler here, and reference it from activities when required.
 */    
public class MyApplication extends Application {
    private DataHandler dataHandler;

    public DataHandler getDataHandler() {
        return dataHandler;
    }

    public void onCreate() {
        DataHandler dataHandler = new DataHandler();
    }
}

/**
 * Activity
 */    
public class MyActivity extends Activity {
  DataHandler dataHandler;

  public void onCreate(Bundle o) {
    dataHandler = ((MyApplication) getApplication()).getDataHandler();
  }

  public void onResume() {
    // trigger data refresh (OBS! This could also be by a button press etc.)
    dataHandler.getData();
  }

  public void updateUI() {
    // UPDATE UI

    // should be called on DataHandler when data is received. HOW?
  }
}

1 Ответ

1 голос
/ 06 июня 2011

Зарегистрируйте свою активность в качестве слушателя DataHandler, и когда поток получит данные, вызовите любых слушателей.

Как вы представляете данные? Если это ListView с ArrayAdapter, тогда просто вызовите notifyDataSetChanged() для него, когда вы получите обновление.

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

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