2014-11-02 35 views
4

我目前正在編寫一個連接到服務器以發出POST請求的應用程序。出於這個原因,我爲各種網絡操作創建了多個Retrofit界面。我有一個執行註冊:我採取用戶名,電子郵件等,做一個POST請求,然後作爲最後一個參數,我有一個回調(RegistrationResult是一個POJO接受「成功」或「失敗」類變量) 。它的界面看起來是這樣的:Retrofit.Callback的成功()和失敗()在同一活動中的兩個接口實現的情況下

public interface RegistrationInterface { 

    @FormUrlEncoded 
    @POST("/api/apiregistration.php") 
    void connect(@Field("country") String country, 
      @Field("state") String state, @Field("email") String email, 
      @Field("pwd") String password, 
      Callback<RegistrationResult> resp); 

} 

現在,因爲我要使用GCM推送通知,我有發送特定設備的註冊ID服務器,並再次另一個界面,得到響應背部。該界面如下所示:

public interface SendRegIDInterface { 

    @FormUrlEncoded 
    @POST("/api/apiregid.php") 
    void connect(@Field("reg_id") String reg_id, 

    Callback<RegIDResult> resp); 

} 

到目前爲止,這麼好。當我嘗試在同一個類中創建兩個接口的實現時,問題就出現了。假設我有一個Activity,出於某種原因,應該使用兩個接口的實現。所以我有這樣的:

public class MessageActivity extends Activity implements Callback { 

public void onCreate(Bundle firebug) { 

RestAdapter restAdapter1 = new RestAdapter.Builder().setEndpoint(endpoint).build(); 
RegistrationInterface regInter = restAdapter1.create(RegistrationInterface.class); 
regInter.connect(// parameters here, MessageActivity.this); 

RestAdapter restAdapter2 = new RestAdapter.Builder().setEndpoint(endpoint).build(); 
SendRegIDInterface regIDInter = restAdapter2.create(SendRegIDInterface.class); 
regIDInter.connect(reg_id, MessageActivity.this); 



    } 




@Override 
    public void failure(RetrofitError arg0) { 

    } 

    @Override 
    public void success(Object arg0, Response arg1) { 

} 

} 

我的問題是這樣的:你在哪裏的Retrofit.Callback接口的重載方法(成功與失敗)對應?由於我在同一個Activity中有兩個Retrofit接口實現,我怎麼能區分返回的內容,例如。 success()方法?它是來自RegistrationInterface實現的響應還是來自Callback的success()方法參數中包含的SendRegIDInterface的響應?只要我在Activity中只有一個RegistrationInterface接口的實現,一切都很清楚:success()方法的參數包含服務器對註冊請求的響應。現在我正在使用第二個接口實現(SendRegIDInterface),我非常困惑!

或者我完全錯了嗎?

+0

檢查這個應答解耦請求和回調。 http://stackoverflow.com/a/31219041/560040 – Laranjeiro 2015-07-04 09:29:32

回答

5

我認爲你需要多一點分離。如果你想在你的活動中放置回調,那麼業務邏輯將會與UI相關的東西混亂得太多。

當我使用改裝我做這種方式(將你的代碼演示了它):首先,我有一個RegistrationClient.java,在那裏我定義的所有端點的API:

public interface RegistrationClient { 

    @FormUrlEncoded 
    @POST("/api/apiregistration.php") 
    void connect(@Field("country") String country, 
      @Field("state") String state, @Field("email") String email, 
      @Field("pwd") String password, 
      Callback<RegistrationResult> resp); 

} 

在這種情況下,它只有一個終點,但會有這樣的情況,哪裏還會有更多,例如:

  1. GET /persons/{id}
  2. POST /persons/
  3. PUT /persons/{id}

當我得到我的客戶端時,然後創建接口的模型。我將它命名爲RegistrationModel你的情況:

public class RegistrationModel { 

    private RegistrationClient _client; 

    public RegistrationModel() { 
    RestAdapter restAdapter = new RestAdapter.Builder() ... // create an adapter 
    _client = restAdapter.create(RegistrationClient.class); 
    } 

    public void connect(String country, String state, String email, String password) { 
    // you can add an additional callback parameter for returning info to the caller. 
    _client.connect(country, state, email, password, new Callback<RegistrationResult> { 

     @Override 
     public void failure(RetrofitError error) { 
     // Do the essential things, and do a callback to the caller if needed 
     } 

     @Override 
     public void success(RegistrationResult result, Response response) { 
     // Do the essential things, and do a callback to the caller if needed 
     } 
    } 
} 

然後,我會用我自己的service locator,或使用依賴注入(與Dagger)持有單參考每個模型。 所以從你的活動中,調用將是這樣的:

... 
ServiceLocator.getRegistrationModel().connect(country, state, email, password); 
... 

或者,如果你加入你自己的回調:

... 
ServiceLocator.getRegistrationModel().connect(country, state, email, password, 
    new RegistrationCallback(boolean result) { 
    // do something. 
    } 
); 
... 
+0

感謝您的詳細答案!這是一個很好的解決方法! – Antonis427 2014-11-02 19:41:53

相關問題