2012-08-16 48 views
1

我已經寫了一個處理程序,每隔一段時間調用一次該方法。我想在destroy()中刪除那個處理程序。我的代碼如下方式使用,在OnCreate中()刪除處理程序的回調不工作

private final Handler _handler = new Handler(); 
public int DATA_INTERVAL = 30 * 1000; 
Runnable getData; 
getData = new Runnable() 
     { 
      @Override 
      public void run() 
      { 
        recieveData(); 
      } 
     }; 

_handler.postDelayed(getData, DATA_INTERVAL); 

和的OnDestroy(),我使用,

_handler.removeCallbacks(getData); 

但removecallbacks無法正常工作。它在退出活動後調用。

+1

你可以不帶任何參數調用'_handler.removeCallbacksAndMessages()'。它消除在回調一切消息棧 – Korcholis 2012-08-16 06:50:02

+1

@Kor調用_handler.removeCallbacksAndMessages()不帶參數時,它提供的錯誤。 – Shalini 2012-08-16 07:07:27

+0

_handler.removeCallbacksAndMessages(null)使用這一行,讓我知道它是否工作。 – Randroid 2012-08-16 08:35:58

回答

9

removeCallbacks(Runnable r)

刪除是在消息隊列中可運行爲r的任何待處理的訊息。

這樣,所以如果要停止正在運行的可運行的,然後使用布爾varaible用於回採主題removeCallbacks(..)只停止未決消息(的Runnable)不是當前正在運行的可運行時,從您的應用程序的用戶退出。

看到這個帖子的removeCallbacks not stopping runnable

+4

錯了。注意他的呼喚從''onDestroy'其中removeCallbacks'運行在主線程。因此,要麼掛起了Runnable運行第一和然後'onDestroy'取消所有未來的回調,或'onDestroy'先運行,並取消所有未來的回調,所以沒有可運行後,會在運行。他有一個不同的問題。 – 2016-03-15 16:22:10

0

你沒有顯示這是receiveData方法的代碼的最重要的部分。正如您所說的,您正在定期執行任務,您必須再次從該方法內調用postDelayed以重新安排任務。可能後臺線程涉及,因爲你不能在主線程上進行聯網。

退出活動時,您很可能會遇到競爭狀況。 onDestroy先運行,然後再次發佈任務。