2011-12-20 81 views
1

我想每10分鐘運行一個特定的方法doThis()(這不是CPU密集型操作,它只是一個POST服務器),當該方法完成執行時,通知用戶(通過ToastNotification或某物)。但我不想阻塞UI線程,因爲我期望用戶仍然在與UI進行交互。什麼是最有效的方法來做到這一點?通過Handler?或者Service或某種(即IntentService)?以設定的時間間隔執行方法的最有效方法?

回答

3

國際海事組織最乾淨和最有效的方式是使用ScheduledThreadPoolExecutor,查看我的回答here代碼示例,希望這可以幫助。

+0

我稱之爲「關機()」後。如果我選擇啓動相同的ScheduledThreadPoolExecutor備份,我會被允許嗎?或者我將不得不創建實例? – 2011-12-21 13:52:36

+0

如果用戶更改應用程序,執行程序是否會在後臺運行? – 2011-12-21 14:20:03

+0

@MohitDeshpande,很好的問題,在調用shutdown()之後,如果你想再次使用它,你需要初始化一個新的。否則在嘗試提交新任務時會得到RejectedExecutionException。對於你的第二個問題,我想是的,但不是100%肯定的,最好自己嘗試一下。 – yorkw 2011-12-21 19:52:39

-1

我會推薦定時器類如你所說你必須執行定時任務。 如果您需要執行此操作,而您的活動運行 可以使用定時器類的活動本身別人一樣,你可以把它的服務在後臺運行..

請參閱本鏈接。 :http://developer.android.com/resources/articles/timed-ui-updates.html

+0

我反對定時器的建議。除了這些人之外,我一直沒有遇到任何問題,特別是在異常處理方面。定時器幾乎只是吞下它們,讓你想知道它的工作與否的天氣。 – 2011-12-20 04:29:32

+0

我很遺憾聽到你的經歷,但直到日期我有完美的功能。 – Abhinava 2011-12-20 08:55:15

0

AsyncTask怎麼樣?

doInBackground方法將幫助您在特定間隔的後臺運行您的特定方法,而無需與UI線程交互。

onPostExecute將幫助你通知使用Toast

0

我通過AsyncTask做到這一點的用戶。該doInBackground()方法看起來是這樣的(只是一個僞代碼):

doInBackground(String... params){ while (running){ doThis(); Thread.sleep(10 * 1000); } }

我想補充一點,我的應用程序執行這些更新(GET和POST)更頻繁(每隔5-10秒),並顯示給用戶帶來新的價值 - 這就是我使用活動的原因。相反,您可以從服務中啓動AsyncTask。

你擁有的另一個選擇是使用AlarmManager--儘管我還沒有走上這條道路。

+0

如果用戶切換應用程序,AsyncTask仍會在後臺運行嗎? – 2011-12-21 14:27:03

+0

是的,除非你採取措施防止這種情況發生。就我而言,我從一個Activity開始'AsyncTask'。在'onPause()'中,我「暫停」任務(使用一些自定義邏輯)。如果您從「服務」開始執行任務,則可以選擇允許它在後臺繼續。 – curioustechizen 2011-12-22 04:47:00

相關問題