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