2012-03-09 65 views
5

應用程序可能具有在單獨的線程上運行並在完成時回叫某個對象的部分。典型的模式可能如下所示:在Android上處理異步回調有什麼好策略?

1)View或Fragment會調用某個模型。呼叫從某些查看或片段

model.doSomething(context, new Runnable() { 
    public void run() { /* run on the main thread when model finishes */ } 
}); 

2)模型使用一個線程或的AsyncTask,做事情起源,然後調用調用線程上的回調 - 通過處理器

void doSomething(Context context, Runnable callback) { 
    Handler handler = new Handler(); 
    // ... 
    // When finished (this is really done on some separate thread), 
    handler.post(callback); 
} 

3)回調與調用View或Fragment進行交互以通過某些控制邏輯推進

回調可能是觸摸未附加到窗口的View的狀態,這可能會導致應用程序不穩定。

什麼是一些很好的策略來處理這種情況?

回答

1

聽起來好像你想要以更一致的方式處理模型和視圖之間的通信。分離是個不錯的方法是使用一個服務:

http://developer.android.com/reference/android/app/Service.html

如果你的應用程序只在一個進程中運行,我會建議尋找到IntentService自其更易於使用。

這方面的一個很好的例子是谷歌IO 2011 IOSched應​​用:

http://code.google.com/p/iosched/

似乎相當大,但建築是經過深思熟慮的有關於分離的數據問題(無論是從本地或遠程資源)。

讓它在自己的服務中運行而不是在視圖中綁定回調的第二個好處是服務不在活動的生命週期中,所以無需擔心活動發生時的回調會發生什麼銷燬/暫停。當使用像這樣的回調時,很多時候回調會被調用,並且活動可能還沒有活動。

+0

謝謝斯蒂芬,我會看看2011年IOSched應​​用程序。一個服務似乎有些過分,因爲看起來應該有一種方法可以安全地將消息發回到視圖或片段。我一直在嘗試使用post(...),但是我仍然瞭解它是如何在窗口不可見的情況下工作的,以及一般的Android模式。 – 2012-03-09 06:45:20

+0

這看起來好像過火了,但是當你使用這種回調模式時,你通常會做某種長時間運行的異步任務。由於調用和完成之間可能存在很大的時間差異,因此您需要開始擔心時間會影響您的狀態。在活動生命週期內工作時,這會變得更加麻煩,因爲對活動的當前狀態沒有任何保證。 – 2012-03-09 12:40:49