Остановка исполняемых задач Handler при уничтожении Activity

Я обычно делегирую все события Activity в отдельный класс контроллера, у которого есть специальный метод для обработки событий от Activity

@Override
public boolean handleMessage(int what, Object data) {
    switch (what) {
    case ExerciseViewEvent.STARTUP:
        workerHandler.post(new Runnable() {
            public void run() {
                onStartup();
            }
        });
        return true;
}

Это сделано для того, чтобы чтобы поддерживать отзывчивость потока пользовательского интерфейса и выполнять все вычисления в фоновых задачах.

Однако, когда система вызывает метод Activity.onDestroy(), вызывается метод controller.dispose(), который таким образом очищает все содержимое контроллера

@Override
protected synchronized void dispose() {
    .................
    if (model != null) {
        synchronized (model) {
            model.dispose();
        }
        model = null;
    }
    helper = null;
    .....................
    super.dispose();
}

. ] Как видите, удаление контроллера происходит в потоке пользовательского интерфейса, без делегирования его потоку обработчика.

Проблема возникает, когда, например, onDestroy вызывается в середине метода onStartup(): onDestroy очищает модель и все остальные ссылки , но внутри метода onStartup он в какой-то момент пытается получить доступ к модели, но, учитывая, что он null, генерируется исключение.

Как лучше всего решить эту проблему? Я не хочу блокировать каждый метод контроллера, потому что некоторые из них могут выполняться одновременно, не мешая друг другу.

11
задан andersoj 10 May 2012 в 00:54
поделиться