2012-03-06 47 views
8

時,我通常委託活動事件到一個單獨的控制器類,它有從Activity停止處理器運行的任務破壞活性

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

此處理事件的特殊方法,以保持UI線程響應和完成在後臺任務中進行所有計算。

然而,當Activity.onDestroy()方法由系統調用,controller.dispose()方法被調用,其中清理在控制所有的東西這樣

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

正如你所看到的,控制器處置發生在UI線程,不委託給一個處理程序線程。

的問題發生時,例如,onDestroy被稱爲onStartup()方法的中間:onDestroy清理模型和所有其他引用,但裏面onStartup方法,它試圖在某個時候訪問的模式,但考慮到它是null,引發異常。

解決此問題的最佳方法是什麼?我不想鎖定每個控制器方法,因爲它們中的一些可能會同時發生而不會相互干擾。

+0

此外,系統可能不會調用onDestroy方法。 – Yury 2012-03-06 18:18:56

+0

好點的Yuri,但是如果它沒有被調用,那麼所有由活動分配的對象都被JVM自己銷燬了?所以我不必擔心,對吧?在處置我只處理所有的對象,沒有別的。 – 2012-03-08 09:03:19

回答

4

在dispose()方法中,應該在處理模型之前清理workerHandler。請參閱Handler類中的removeCallbacksremoveCallbacksAndMessage(null)方法。當參數爲null時,後一種方法將刪除所有回調和消息。

+0

workerHandler是Handler的類型。我如何取消使用post()方法添加到此處理程序的所有可運行的? – 2012-09-24 06:54:49

+0

我在回答 – 2012-09-24 16:45:46

+0

中增加了一個鏈接,但是這意味着我需要跟蹤所有我添加的回調,否則我不知道應該刪除哪些回調。沒有像「removeAllCallbacks()」之類的東西。然後我應該有一個列表,比如'List ',並在那裏存儲所有可運行的程序。 – 2012-09-25 05:42:11