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

Mes étapes:Android: Rénovation: demandes asynchrones consécutives multiples. Тoo de nombreux éléments imbriqués

  1. demande de départ: getCompaniesList()
  2. Wait réponse de succès
  3. Démarrer une autre Demande async: getCatalogsList()
  4. Wait réponse de succès
  5. Faites quelques autre code

snippet Ici, dans mon activité:

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) { 

      } 
     }); 

Je pense que cette structure n'est pas très agréable. Тoo de nombreux éléments imbriqués. Comme le code résultat est plus compliqué.

Question: A une alternative à cette structure?

+1

Je recommande d'utiliser 'RxJava' pour quelque chose comme ça. –

+0

Nous avons rencontré le même problème où je travaille. Une solution laide pour améliorer le code serait de notifier les interfaces en cas de succès et de faire le travail dans chaque interface. Mais comme mentionné @John, consultez [RxJava] (https://www.captechconsulting.com/blogs/getting-started-with-rxjava-and-android) ou par chèque [Otto] (http: //square.github. io/otto /) bibliothèque – riadrifai

Répondre

1

Vous pouvez prendre le temps d'apprendre Rx RXjava2

ou vous pouvez diviser votre code comme celui-ci

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

Je pense que déplacer des éléments internes à des méthodes distinctes (getCatalogsListCallback()) - est une bonne solution. Comme résultat l'imbrication des éléments toujours = 1. Et maintenant le code est simple à lire. – Alexei

+0

si cela résout votre problème s'il vous plaît upvote ma réponse et l'accepter comme la bonne réponse à votre question – Boukharist