2012-05-30 65 views
2

我想實現一個將啓動AsyncTask的服務。從服務啓動的Android AsyncTask

在AsyncTask onProgressUpdate()我想更新主線程中的TableLayout。

一切都很好,但有一個疑問:如何處理主線程被破壞或不可見的情況?
該服務將繼續,直到它stopSelf(),這就是我想要的。
但AsyncTask如何知道不更新TableLayout?

回答

0

我認爲解決方案是沿着主要活動可見或不通過onResume()和onPause()上的消息知道服務知道的路線。

該服務反過來將在AsyncTak中設置一個標誌,當該標誌爲false時,onProgressUpdate()將不執行UI更新而退出。

所以我想,如果我理解服務文檔的權利,我的服務將不得不開始 - 粘性,也受到同一活動的約束。我只需要弄清楚如何重新綁定正在運行的服務。

0

好吧,當我閱讀你的第二篇文章時,我對事情有了更好的理解。

這裏有一個典型的生產者 - 消費者問題。服務的AsyncTask產生消費者(主要活動)需要顯示的東西。解決方案是使用LinkedBlockingQueue來存儲所有下載的項目。該活動將需要有自己的AsyncTask,它將從LinkedBlockingQueue進行輪詢。這裏是基本的方法:

該服務有一個下載數據的AsyncTask。每個項目都存儲在無界的LinkedBlockingQueue中。

該活動從onResume啓動一個AsyncTask並從onPause中將其取消。此任務將輪詢LinkedBlockingQueue,然後在TableLayout中顯示每個項目。

+0

我認爲你閱讀這篇文章太快了,如果UI活動可見,我需要更新TableLayout。通知區域不是解決方案。想想一個後臺任務,它必須下載100個文件並顯示哪些文件已經加載到TableLayout或ListView中。 – ilomambo

+0

我根據對問題的更好理解編輯了我的答案。 – RajV

+0

你已經給了我第二個解決方案,我現在有。我有一個AsyncTask生成一個ArrayList並顯示其進展到UI。我想重寫我的代碼以使用服務,因爲即使用戶轉到其他應用程序,我也需要生產者保持活躍狀態​​。從我在你的答案中看到的情況來看,你的解決方案並非如此。看到我自己的答案。 – ilomambo