solito delegare tutte le attività gli eventi a una classe controller separato, che ha un metodo speciale per la gestione di eventi da Activity
arresto delle attività eseguibili Handler quando distruggendo attività
@Override
public boolean handleMessage(int what, Object data) {
switch (what) {
case ExerciseViewEvent.STARTUP:
workerHandler.post(new Runnable() {
public void run() {
onStartup();
}
});
return true;
}
Questo viene fatto al fine di mantenere thread UI reattivo e effettuare tutti i calcoli nelle attività in background.
Tuttavia, quando Activity.onDestroy()
metodo viene chiamato dal sistema, controller.dispose()
metodo è chiamato, che pulisce tutta roba controller questo modo
@Override
protected synchronized void dispose() {
.................
if (model != null) {
synchronized (model) {
model.dispose();
}
model = null;
}
helper = null;
.....................
super.dispose();
}
Come si può vedere, lo smaltimento del regolatore avviene in thread UI, senza delegandolo a un thread di gestore.
Il problema si verifica quando, per esempio, onDestroy
è chiamato in mezzo onStartup()
metodo: onDestroy
pulisce il modello e tutti gli altri riferimenti, ma all'interno onStartup
metodo si cerca di accedere al modello a un certo punto, ma considerando che è null
, viene generata un'eccezione.
Qual è il modo migliore per risolvere questo problema? Non voglio bloccare tutti i metodi del controller perché alcuni di essi possono accadere contemporaneamente senza interferire l'un l'altro.
Inoltre, è possibile che il metodo onDestroy non venga chiamato dal sistema. – Yury
Buon punto Yuri, ma se non viene chiamato, tutti gli oggetti allocati dall'attività vengono distrutti da JVM stesso? Quindi non devo preoccuparmene, vero? Dispongo di disporre solo di tutti gli oggetti, nient'altro. –