我想每10分鐘運行一個特定的方法doThis()
(這不是CPU密集型操作,它只是一個POST服務器),當該方法完成執行時,通知用戶(通過Toast
或Notification
或某物)。但我不想阻塞UI線程,因爲我期望用戶仍然在與UI進行交互。什麼是最有效的方法來做到這一點?通過Handler
?或者Service
或某種(即IntentService
)?以設定的時間間隔執行方法的最有效方法?
回答
國際海事組織最乾淨和最有效的方式是使用ScheduledThreadPoolExecutor,查看我的回答here代碼示例,希望這可以幫助。
我會推薦定時器類如你所說你必須執行定時任務。 如果您需要執行此操作,而您的活動運行 可以使用定時器類的活動本身別人一樣,你可以把它的服務在後臺運行..
請參閱本鏈接。 :http://developer.android.com/resources/articles/timed-ui-updates.html
我反對定時器的建議。除了這些人之外,我一直沒有遇到任何問題,特別是在異常處理方面。定時器幾乎只是吞下它們,讓你想知道它的工作與否的天氣。 – 2011-12-20 04:29:32
我很遺憾聽到你的經歷,但直到日期我有完美的功能。 – Abhinava 2011-12-20 08:55:15
我通過AsyncTask
做到這一點的用戶。該doInBackground()
方法看起來是這樣的(只是一個僞代碼):
doInBackground(String... params){ while (running){ doThis(); Thread.sleep(10 * 1000); } }
我想補充一點,我的應用程序執行這些更新(GET和POST)更頻繁(每隔5-10秒),並顯示給用戶帶來新的價值 - 這就是我使用活動的原因。相反,您可以從服務中啓動AsyncTask。
你擁有的另一個選擇是使用AlarmManager
--儘管我還沒有走上這條道路。
如果用戶切換應用程序,AsyncTask仍會在後臺運行嗎? – 2011-12-21 14:27:03
是的,除非你採取措施防止這種情況發生。就我而言,我從一個Activity開始'AsyncTask'。在'onPause()'中,我「暫停」任務(使用一些自定義邏輯)。如果您從「服務」開始執行任務,則可以選擇允許它在後臺繼續。 – curioustechizen 2011-12-22 04:47:00
- 1. Java:以指定的時間間隔執行方法
- 2. 間隔執行方法
- 3. 測量方法執行時間的有效方法
- 4. 以隨機時間間隔執行方法
- 5. 通過指定時間間隔填充頁面的最有效方法?
- 6. 執行SAS列之間差異的最有效方法
- 7. C++ 11計時庫 - 如何在特定的時間間隔後執行方法?
- 8. 執行&&的最有效方法?
- 9. 如何設置方法的最大執行時間?
- 10. 在特定的時間間隔後執行任務的正確方法
- 11. 以小時間塊查詢cassandra的最有效方法
- 12. 在指定的時間間隔內運行強制方法
- 13. 計算的方法的執行時間
- 14. 執行的方法來檢查的時間和特定的時間執行的方法
- 15. 在特定時間間隔關閉android應用程序的有效方法
- 16. 查找方法的執行時間
- 17. java中的方法執行時間
- 18. 基於時間的C#執行方法#
- 19. 記錄的方法執行時間
- 20. 編程方法執行的開始時間 - 當時開始執行的方法
- 21. 定時器間隔調用長方法
- 22. windows服務在C++中以一定的時間間隔運行一個方法
- 23. 如何以固定的時間間隔運行後臺作業方法?
- 24. 方法內的設置間隔
- 25. 在定時間隔播放聲音的最佳方法?
- 26. 方法與時間間隔(asp.net C#)
- 27. 在給定的時間頻率(定時器)執行功能的最佳方法?
- 28. 一定的隨機時間間隔後的調用方法
- 29. 測量方法執行時間的基本方法
- 30. 運行一定的時間的方法
我稱之爲「關機()」後。如果我選擇啓動相同的ScheduledThreadPoolExecutor備份,我會被允許嗎?或者我將不得不創建實例? – 2011-12-21 13:52:36
如果用戶更改應用程序,執行程序是否會在後臺運行? – 2011-12-21 14:20:03
@MohitDeshpande,很好的問題,在調用shutdown()之後,如果你想再次使用它,你需要初始化一個新的。否則在嘗試提交新任務時會得到RejectedExecutionException。對於你的第二個問題,我想是的,但不是100%肯定的,最好自己嘗試一下。 – yorkw 2011-12-21 19:52:39