2015-10-12 109 views
6

我是新來的android和正在審閱文檔和一些教程。syncadapter,服務,裝載機,提供商和asynctask之間的困惑?

服務

開發指南說,它應該被使用,當需要有運行在後臺長時間運行的任務,比如音樂播放器。

的AsyncTask

創建工作線程使用api喜歡把自己的數據執行後臺任務,然後通知UI線程上它onPostExecute()回調方法。

裝載機

在單獨的線程執行的操作,寄存器到聽衆並通知上的數據集的變化。

提供商通過在清單文件將它們暴露不同的應用程序之間

共享數據。

SyncAdapter

爲了同步機器人設備和web服務器之間的數據。

理論上,我瞭解上述概念,比如它們的用途。 我很難把它們放在什麼時候使用什麼?什麼是最好的使用?在什麼情況下應該使用什麼?

緩存,我用sqlite或圖書館像凌空retrospice

正如我說我是機器人初學者和試圖瞭解這些概念。

任何幫助和建議,將不勝感激。 Thankx提前。

+0

你的問題太廣泛了。請通過指定要實現的實際用例來縮小範圍。 –

+1

謝謝你的回覆@StephanBranczyk。我只是想清楚一下,在什麼情況下,最好的方法是什麼。假設一個應用程序顯示天氣預報,我也可以使用aynctask打天氣api或服務。爲了緩存目的,我可以使用sqlite或者volley等庫。以及查詢和其他所有目的的內容提供商。 aysnc加載數據並監聽數據源的加載程序將其更改爲綁定數據。我只是好奇,如何將所有這些東西封裝成一個更好的解決方案。對不起,我對此感到困惑。 – Ritesh

+1

這裏是信息圖表,可能會幫助你更好地理解:)第三個選項是服務:https://raw.githubusercontent.com/stepnenessolas/robospice/master/gfx/RoboSpice-InfoGraphics.png – Kalem

回答

9

幾件事情要添加到卡萊布的回答是:

的ContentProvider:

Android有實際上許多方法來共享數據。 ContentProvider是在應用程序之間共享數據庫的一種方式。假設您的手機上有3個電子郵件客戶端,可以在您離線時從雲端緩存數據。這是有道理的,你只維護你的電子郵件的一個離線數據庫。如果您有地址簿,短信數據庫或推特數據庫,也是如此。如果你想更新所有的數據,情況也是如此。您只需要真正希望從雲端更新一次數據,而不是每次都更新三次,這會讓我看到下一個主題SyncAdapter。

SyncAdapter:

一個SyncManager是足夠聰明,做所有的同步請求一氣呵成,儘量減少天線供電時間,從而節省電池使用。此外,在AccountManager的幫助下,手機用戶可以自己重寫同步偏好設置,但只有開發人員首先選擇使用SyncAdapter時纔是如此。

此外,SyncAdapter只能與ContentProvider一起使用。因此,即使您不想與其他應用程序共享數據,如果您想使用SyncAdapter,也必須使用內容提供商。 ContentProviders對於初學者(甚至是中級開發者)來說很難實現。我建議你暫時遠離他們。你應該使用ContentProvider,如果已經有一個你想要做的,但我不建議你嘗試創建自己的。

裝載機:

裝載機都不錯。學習如果要顯示來自本地數據庫(或來自ContentProvider)的數據,請使用它們。他們會節省你的時間。與SyncAdapter不同,加載器不需要ContentProvider就可以工作。他們可以直接訪問SQLite。

服務:

瞭解如何使用它們。對他們有太多的話要說。重要的一點是,你應該通過使用像AlarmManager或BroadcastReceivers這樣的組件來最小化他們的活躍時間。此外,您需要了解Service和IntentService之間的區別。

的AsyncTask:

的AsyncTask是很經常需要在Android中,以避免阻塞主UI線程。不要以爲你使用的是AsyncTask,你可以放棄使用服務。

請注意,很多Android教程只給你展示一個概念的最小代碼量,所以它們通常會跳過適當的線程。請注意,如果您願意,您可以手動啓動自己的線程,但AsyncTask爲您做了其他事情,使其成爲許多UI線程被阻塞並且出現「應用程序無響應」錯誤的情況下的理想選擇。

庫:

有許多很好的圖書館在那裏。我不會說哪些是好的。學會使用每個人都推薦的。這些庫可以爲你做很多事情(假設你足夠好,可以讓它們工作)。有一點學習曲線,但它是值得的。而且他們在更高的抽象層次上處理Android,所以通常,線程和其他許多事情通常都會照顧你。

還有很多其他的東西,我沒有提到,或者我沒有提到,但就像我說的,我認爲你的問題太廣泛了。如果您確實需要更多詳細信息,則應該查看一些開發人員指南並觀看Google提供的一些YouTube視頻。

+0

謝謝@Stephan,我會在我的學習曲線上探索更多。它確實清除了許多基本概念。 – Ritesh

+0

SyncAdapter不需要ContentProvider。您創建一個存根帳戶和ContentProvider,並將其與另一個持久性方案一起使用。 https://developer.android.com/training/sync-adapters/creating-sync-adapter.html –

+0

也避免使用AsyncTask:http://blog.danlew.net/2014/06/21/the-hidden-pitfalls -of-的AsyncTask / –

2

真快回答:

的AsyncTask:可能會阻止用戶界面線程短任務。你不介意他們是否取消,你必須重新啓動它們。

服務:當你有很長的任務時使用,你不想被應用程序更改中斷。比起AsyncTask更難以實現。

裝載機:專爲數據庫訪問

SyncAdapter:在這裏你不必實時數據。您可以在給定時刻安排數據同步(即同步郵件,聯繫人數據等)。假設你每小時都有新的數據。

供應商:與上述無關。這用於在應用程序之間共享數據。您不關心共享應用程序如何檢索數據,只需知道您可以要求提供給定的資源。

這infographis幫助我更好地瞭解第3:https://raw.githubusercontent.com/stephanenicolas/robospice/master/gfx/RoboSpice-InfoGraphics.png

+0

謝謝@kalem,這個很好的答案。它清除了大部分相關概念。尤其是你分享的infographis。但我仍然希望得到一個詳細的答案。 – Ritesh