2012-03-06 10 views
8

solito delegare tutte le attività gli eventi a una classe controller separato, che ha un metodo speciale per la gestione di eventi da Activityarresto 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.

+0

Inoltre, è possibile che il metodo onDestroy non venga chiamato dal sistema. – Yury

+0

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. –

risposta

4

Nel metodo dispose() è necessario pulire workerHandler prima di smaltire il modello. Vedere i metodi removeCallbacks o removeCallbacksAndMessage(null) nella classe Handler. Il secondo metodo rimuove tutti i callback e i messaggi quando l'argomento è null.

+0

workerHandler è il tipo di gestore. Come posso cancellare tutti i runnables che sono stati aggiunti a questo Handler usando il metodo post()? –

+0

ho aggiunto un collegamento nella risposta –

+0

sì, ma questo significa che devo tenere traccia di tutti i callback che aggiungo, altrimenti non so quali callback dovrei rimuovere. Non esiste un mehtod come "removeAllCallbacks()" o qualcosa del genere. Dovrei quindi avere una lista come 'Lista ' e memorizzare tutti i runnables lì. –

Problemi correlati