2017-10-19 41 views
0
com.squareup.retrofit2:retrofit:2.3.0 

我的步驟:Android:改造:多個連續的異步請求。 Тoo許多嵌套項目

  1. 開始異步請求:getCompaniesList()
  2. 等待成功響應
  3. 啓動另一個異步請求:getCatalogsList()
  4. 等待成功響應
  5. 做一些其他的代碼

這裏摘錄我的活動:

RestClient restClient = RestClientFactory.getRestClient(); 
     Call<List<Company>> companyList = restClient.getCompaniesList(filters); 

     companyList.enqueue(new Callback<List<Company>>() { 
      @Override 
      public void onResponse(Call<List<Company>> call, Response<List<Company>> response) { 
       if (response.isSuccessful()) { 
        RestClient restClient = RestClientFactory.getRestClient(); 

        Call<List<Catalog>> catalogList = restClient.getCatalogsList(filters); 
        catalogList.enqueue(new Callback<List<Catalog>>() { 
         @Override 
         public void onResponse(Call<List<Catalog>> call, Response<List<Catalog>> response) { 
          if (response.isSuccessful()) { 
           // HERE SOME NEED CODE!!! 
          } 
         } 

         @Override 
         public void onFailure(Call<List<Catalog>> call, Throwable throwable) { 

         } 
        }); 
       } 
      } 

      @Override 
      public void onFailure(Call<List<Company>> call, Throwable throwable) { 

      } 
     }); 

我覺得這個結構不是很好。 Т多個嵌套物品。由於結果代碼更復雜。

問題:這個結構有其他選擇嗎?

+1

會建議使用'RxJava'這樣的事情。 –

+0

我在工作中遇到過同樣的問題。更好看的代碼的一個醜陋的解決方案將成功通知接口,並在每個接口中進行工作。但正如@約翰提到的,檢查[RxJava](https://www.captechconsulting.com/blogs/getting-started-with-rxjava-and-android)或檢查[Otto](http://square.github。 io/otto /)庫 – riadrifai

回答

1

您可以花時間去學習的Rx RXjava2

,也可以分散你這樣的代碼

RestClient restClient = RestClientFactory.getRestClient(); 
Call<List<Company>> companyList = restClient.getCompaniesList(filters); 

companyList.enqueue(getCompanyListCallback()); 

private Callback<List<Company>> getCompanyListCallback() { 
    return new Callback<List<Company>>() { 
     @Override 
     public void onResponse(Call<List<Company>> call, Response<List<Company>> response) { 
      if (response.isSuccessful()) { 
       RestClient restClient = RestClientFactory.getRestClient(); 
       Call<List<Catalog>> catalogList = restClient.getCatalogsList(filters); 
       catalogList.enqueue(getCatalogsListCallback()); 
      } 
     } 

     @Override 
     public void onFailure(Call<List<Company>> call, Throwable throwable) { 

     } 
    }; 
} 

private Callback<List<Catalog>> getCatalogsListCallback() { 
    return new Callback<List<Catalog>>() { 
     @Override 
     public void onResponse(Call<List<Catalog>> call, Response<List<Catalog>> response) { 
      if (response.isSuccessful()) { 
       // HERE SOME NEED CODE!!! 
      } 
     } 

     @Override 
     public void onFailure(Call<List<Catalog>> call, Throwable throwable) { 

     } 
    }; 
} 
+0

我認爲將內部項目移動到單獨的方法(getCatalogsListCallback()) - 是一個很好的解決方案。因爲元素的嵌套總是= 1。現在代碼很容易讀取。 – Alexei

+0

如果這解決了您的問題,請upvote我的答案,並接受它作爲您的問題的正確答案 – Boukharist