2013-08-05 38 views
2

什麼是在Android中執行網絡操作的最佳實踐(不需要在ContentProvider中存儲數據)?在Android中執行網絡操作的最佳做​​法是什麼?

當前我使用的模式類似於http://www.youtube.com/watch?v=xHXn3Kg2IQE中描述的模式 - 包裝在Fragment,IntentService和ResultReceiver中的服務助手。

這是相當複雜和骯髒。

正在使用類似於片段(與setRetainInstance(true))啓動AsyncTasks回調該活動足夠好?

我想我還需要處理在活動暫停並重新開始時完成任務的情況。

有沒有比這裏提到的更好的策略?

編輯:網絡運營,我指的是簡單的JSON Web服務

+0

如果您需要處理活動暫停時的情況,則「AsyncTask」可能不是您想要的。我認爲在這種情況下,您當前的設置將成爲您的最佳選擇。 – Geobits

+0

如果您正在尋找「最佳做法」並鏈接到Google演示文稿,那麼很可能您已經有了答案。我認爲你正在尋找「更容易」? – 323go

+2

請完整而準確地解釋**您感興趣的是什麼類型的「網絡操作」。Web服務請求的策略可能與下載圖像縮略圖不同,後者可能與下載大型PDF不同,後者可能與流式音頻,這可能與VOIP客戶端有所不同,這可能與聊天應用程序不同,它可能與Web瀏覽器不同,這可能會有所不同......好吧,希望您明白我的觀點。 – CommonsWare

回答

9

網絡操作,我指的是簡單的JSON Web服務交互的互動

下那麼問題是:你關心手術多少錢?

例如,如果您調用StackOverflow API來檢索某些顯示給用戶的問題,那麼如果用戶在Web服務調用進行時導航離開活動,則可能不關心結果。在這種情況下,我只需要使用Retrofit(或者自己編寫HTTP和JSON後臺線程代碼),從保留的片段中啓動它,並將其稱爲好的。

IntentService將開始發揮作用,如果:

  • 你更敏銳地關注操作發生(例如,你在服務器上修改數據,而不僅僅是檢索它),因此希望以幫助確保您的過程可能足夠長的時間完成工作,或者您正在按計劃進行Web服務調用(例如,AlarmManager)或由其他事件驅動(例如,ConnectivityManager廣播),例如處理當設備訪問互聯網時需要完成的0回撥隊列,或者

  • Web服務調用的結果可能不僅會影響單個用戶界面,因此您希望你的活動

爲了讓你的UI層知道從這樣的IntentService結果外的Web服務調用「擁有」的一個組成部分,我只是其它任何東西在ResultReceiver。我喜歡Square的Otto,但任何事件總線(例如greenrobot的EventBus)或LocalBroadcastManager都可以使用。

SyncManager也是另一種選擇,雖然這是在我的待辦事項列表中進行。

但是,我不一定會將其中的任何一個描述爲「最佳實踐」,因爲Android對於我們有能力在此領域宣佈「最佳實踐」,特別是沒有非常精確的描述用例。他們是「不完全荒謬」的做法。

+0

爲什麼事件總線比'ResultReceiver'好得多以便將結果返回到UI層? –

+0

@ GalBen-Haim:事件總線讓多個UI組件更容易瞭解結果。事件總線允許將結果發送到發件人以外的其他地方。一些事件總線實現(例如Otto,EventBus)給你比Bundle更靈活的事件對象。等等 – CommonsWare

+0

很好的答案@CommonsWare謝謝。 – tasomaniac

相關問題