2013-03-22 41 views
5

在我的應用程序中,我有很多GET,POST,PUT請求。現在,我有一個單獨的類來保存我下載的數據,並且有許多擴展AsyncTask的內部類。 在我的單例類,我也有幾個接口,像這樣:在Android中編寫很多HTTP請求的好設計模式

/** 
* Handlers for notifying listeners when data is downloaded 
* 
*/ 
public interface OnQuestionsLoadedListener { 

    public void onDataLoadComplete(); 

    public void onDataLoadingError();  
} 

有什麼不對的模式(即延長的AsyncTask許多內部類)? 它可以更有效地完成每個HTTP調用可能只有一個內部類(GET爲1,POST爲1,...)?如果是這樣,如何決定如何在例如GET請求?

回答

0

在最近開發的程序,我遵循了類似的計劃,但在另外實施了WebRequest類做實際的GET,POST,PUT等

我現在已經是一個「連接器」類,它有一大堆內的AsyncTask子類。 然而,在我的實現中,我讓它們接受了一個Callback對象,每個子類都通過這個對象傳遞Http結果。

我認爲這是一個有效的,如果可能不是理想的方式。

我的想象可能是一個改進,如果我只有一個Asynctask的子類,我會將請求體(現在構建在這些不同的任務中),請求url和方法以及回調(在我看來,這是一個相當不錯的方式來獲得結果)。

4

總體而言,您應該在執行網絡請求時遠離AsyncTasks。

您的AsyncTasks鏈接到您的活動。這意味着,如果您的活動停止,您的AsyncTask將停止。 這不是獲取數據以顯示在該活動中的最大問題,因爲您不會在意提取已停止。但是,當你想發送一些保存的數據到服務器,並且你的用戶在發送所有內容之前按下「返回」或類似的東西,數據可能會丟失而不能發送。

你想要的是一個服務,它將繼續運行,不管你的活動會發生什麼。我想建議你看看RoboSpice。即使你決定不使用它,閱讀它做什麼以及它爲什麼會這樣做,會讓你很好地瞭解不使用AsyncTasks進行網絡請求的原因以及爲什麼更好地使用服務。 如果你使用這個,你關於高效網絡請求的問題的其餘部分也已經過時,因爲它們會以最好的方式爲你處理。

+0

感謝您的鏈接!我從來沒有嘗試RoboSpice,甚至從來沒有聽說過它,但在閱讀後,我認爲它很棒。所以現在我要儘快嘗試。 – Michael 2013-03-22 12:58:17

+0

祝你好運:)如果你已經和你的應用相差甚遠,RoboSpice不易實現,你基本上也可以建立自己的服務來處理你發送給它的意圖。你可能會錯過一些優化,當然還有緩存,但是仍然可以避開AsyncTasks和Loaders的網絡核心問題。祝你好運 – 2013-03-22 13:02:19

+1

所以如果我在我的asynctask執行期間旋轉屏幕,它會重新啓動? – DixieFlatline 2013-03-22 13:07:28

1

許多異步類沒有錯。

什麼是ido有一個網絡層,一個服務類。作爲intent的一部分,使用resultreceiver對象向服務類發送意圖。然後在服務中使異步任務中的http請求通過結果接收方對象發送回結果。

一個好的設計是從網絡訪問中抽象出UI(活動或片段)。