2017-02-16 19 views
1

我正在開發一個正在發出大量網絡請求的android應用程序。我想設計這樣的方式,我的應用程序: -在java中與網絡相關的操作的最佳設計實踐

  1. 我所有的網絡相關的任務是在一個單獨的類集中,每當我想提出一個要求,我應該只是實例化類,並讓我的請求。基本上我不想用網絡電話污染我的活動。

  2. 設計應該是這樣的,如果將來我想改變我用於網絡調用的庫(okhttp,retrofit,異步等),我不必做很多代碼更改或者如果有任何代碼更改都必須在一個類中,活動不應該能夠區分。我應該能夠通過最少的代碼更改來更改我正在使用的庫。

  3. 我想盡可能地遵循SOLID原則。

  4. 該類應該是單元可測試的。如果我想測試任何其他使用這個類的參數或方法的類,我應該很容易模擬。

我在我的腦海裏的一些想法,我不希望任何代碼示例,我只需要從你們一些建議,這樣我可以從我的應用程序開發之初遵循最佳設計實踐。

謝謝

回答

0

我想你可以創建一個類可以Requester這個類具有保持通信庫對象和類型的接口的這種屬性,它應該是通信庫的包裝所以在這裏,你可以在屬性實施戰略模式。

您的請求者類應該只進行網絡調用,並且應將有效負載傳遞給您的函數。

希望這可以幫助你。每當我想提出一個要求,我應該只是實例化類 ,讓我的要求

+0

我實際上做的事情與此類似。 – Ezio

0
  1. 我所有的網絡相關的任務是在一個單獨的類和 集中。基本上我不想用網絡電話污染我的活動 。

我相信你有保持常數一類,我們可以用它本身。

你可以做什麼,是創建一個類並通過應用程序加載實例化它。您的代碼可能是這個樣子:

public class Constants { 
    // Your code. 
    static { 
     instantiateNetworkHelper(); 
    } 

    public static NetworkHelper netowrkHelper = null; 

    private static void instantiateNetworkHelper() { 
     /* implementation */ 
    } 
} 

這樣,你只是創建助手類只有一個實例,你可以在你的應用程序的任何地方使用它...


  • 設計應是這樣的,如果在將來我想改變我使用了網絡電話(okhttp,改型,異步等) 我的庫不必做很多代碼更改,或者如果有任何代碼更改 他們都必須在一個類中,活動不應該能夠告訴 的區別。我應該只需使用最少的代碼更改即可更改庫文件 。
  • 您可以使用上面的實現,但是這次可以使用抽象的概念。您可以創建一個可以進行網絡調用的抽象類,並且您可以創建抽象方法來獲取網絡協議或任何想要配置/更改的內容。一個例子是這樣的:

    public abstract class NetworkHelper { 
        public void doNetworkCall() { 
         String protocol = getProtocol(); 
         /* implementation */ 
        } 
    
        protected String getProtocol(); 
    } 
    

    而且這樣你可以有多個NetworkHandlers,也就是說,每個幫助來處理特定的協議,並通過創建實現或使用現有的可以進行單元測試它們。

    0

    你可以做的第一件事是設計代表,你將需要操作的接口,然後爲正在使用的庫的實現,例如:

    interface NetworkService { 
        void getRequest(String url, List<RequestParameter> parameterList, Handler<Response> handler); 
        void postRequest(String url, List<RequestParameter> parameterList, Handler<Response> handler); 
    } 
    
    class AsyncNetworkService { 
    
        AsyncImpl networkImpl;//injected so can ne mocked 
    
        void getRequest(String url, List<RequestParameter> parameterList, Handler<Response> handler){ 
         //async specific implementation 
        } 
        void postRequest(String url, List<RequestParameter> parameterList, Handler<Response> handler){ 
         //async specific implementation 
        } 
    
    }