2012-01-27 41 views
0

我想創建一個Service,它能夠創建許多對象,其中每個對象連接到互聯網並下載一些JSON數據和照片。其中大部分是非常直接的,但我希望它一次發生一次,即一個新的對象不能創建,直到第一個對象完成其操作。如何知道對象何時執行了操作?

什麼是我的Service知道對象何時執行其操作的最佳方式?

這裏是什麼,我正在尋找一個非常粗略的說明:

enter image description here

+0

還有其他限制嗎?爲什麼你不能在對象實例中保留對服務的引用(反之亦然,如果你擔心對象將是GC),並且當你完成時你調用服務中的方法? – Luis 2012-01-27 01:33:45

+0

我以前一直在調用服務中的一種方法,但我想知道是否有更好的方法來做到這一點。這似乎有點頑皮:) – 2012-01-27 01:36:06

回答

1

這個怎麼樣?當對象創建完成時,廣播一個意圖(例如,如果您希望它是私有的,則可以使用LocalBroadcast)。

在您的Service中,註冊上述廣播,並在接收到廣播時執行下一個任務。

2

使用IntentService。在正常使用情況下,它接收到的每個Intent都按順序處理,並且已處於後臺線程中,因此您甚至不需要在AsyncTask中執行網絡活動。簡單。

或者,把所有的東西都放在Queue中,並且由於AsyncTask中的呼叫而發生「做下一件事」呼叫。

Queue<YourObject> unfinished = getQueue(); 
List<YourObject> finished = new LinkedList<YourObject>(); 
Handler handler = new Handler(){ 
    handleMessage(Message m){ 
    // Object populated! Start next? Blink lights? Whatever. 
    } 
} 

AsyncTask t = new AsyncTask<...>(handler) { 
    Handler h; 
    public AsyncTask<...>(Handler h) { 
    this.h = h; 
    } 

    protected V doInBackground(YourObject o) { 
    // Network stuff, populate the thing 
    return popualtedThing(); 
    } 

    protected V onPostExecute(YourObject o) { 
    h.sendMessage(Message.obtain(0,o); 
    } 
}.execute(); 
+0

我想你已經誤解了這個問題。我不打算創建一些意向或服務。我需要從一個服務創建對象。 – 2012-01-27 01:34:26

+0

'IntentService'實現 - 你擴展了操作系統提供的 - 會創建對象而不會阻礙對方。然後,您可以隨意將創建的對象發送到任何地方。 – Argyle 2012-01-27 01:36:28

+0

我沒有使用Intents,我正在使用對象。 – 2012-01-27 01:37:58

1

使用監聽器。將後臺服務註冊爲對象實例的偵聽器,並且在對象實例處於啓用狀態時,它只會回調所有偵聽器。

相關問題