2017-10-17 5 views
0

Ich baue eine Aktivität, in der ich Listen von Objekten aus einer API lade. Ich muss mehrere Anfragen mit Retrofit machen, die verschiedene Objekte zurückgibt. Ich kann die Anfragen stellen, aber ich weiß nicht, wie ich überprüfen kann, wann sie fertig sind.Android Retrofit 2 warte auf mehrere Anfragen

Der folgende Code ist, was ich habe.

ApiRepository

public interface ApiRepository { 
    @GET("/api/troopmarker.json") 
    Call<List<TroopMarker>> getTroopMarkers(); 

    @GET("/api/troop.json") 
    Call<List<Troop>> getTroops(); 

    @GET("/api/treasure.json") 
    Call<List<TroopMarker>> getTreasures(); 
} 

RepositoryService

public interface RepositoryService 
{ 
    void loadTroops(final TroopCallback callback); 
    void loadTroopMarkers(final TroopMarkerCallback callback); 
    //void loadTreasures(final TreasureCallback callback); 
} 

RepositoryServiceImpl

public class RepositoryServiceImpl implements RepositoryService { 
    private String url; 
    private Activity context; 

    public RepositoryServiceImpl(String url, Activity context) { 
     this.url = url; 
     this.context = context; 
    } 

    public void loadTroops(final TroopCallback callback) { 
     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(url) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 

     ApiRepository repository = retrofit.create(ApiRepository.class); 

     repository.getTroops().enqueue(new Callback<List<Troop>>() { 
      public List<Troop> troops; 

      @Override 
      public void onResponse(Call<List<Troop>> call, Response<List<Troop>> response) { 
       if(response.isSuccessful()) { 
        Log.d("RETROFIT", "RESPONSE " + response.body().size()); 
        callback.onSuccess(response.body()); 
       } 
      } 

      @Override 
      public void onFailure(Call<List<Troop>> call, Throwable t) { 
       CharSequence text = "Error loading troops."; 
       int duration = Toast.LENGTH_LONG; 

       Toast toast = Toast.makeText(context, text, duration); 
       toast.show(); 
       callback.onSuccess(null); 
      } 
     }); 
    } 

    public void loadTroopMarkers(final TroopMarkerCallback callback) { 
     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(url) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 

     ApiRepository repository = retrofit.create(ApiRepository.class); 

     repository.getTroopMarkers().enqueue(new Callback<List<TroopMarker>>() { 
      @Override 
      public void onResponse(Call<List<TroopMarker>> call, Response<List<TroopMarker>> response) { 
       if(response.isSuccessful()) { 
        Log.d("RETROFIT", "RESPONSE " + response.body().size()); 
        callback.onSuccess(response.body()); 
       } 
      } 

      @Override 
      public void onFailure(Call<List<TroopMarker>> call, Throwable t) { 
       CharSequence text = "Error loading troops."; 
       int duration = Toast.LENGTH_LONG; 
       Toast toast = Toast.makeText(context, text, duration); 
       toast.show(); 
       callback.onSuccess(null); 
      } 
     }); 
    } 

    public void loadTreasures() { 

    } 
} 

LoadActivity

public class LoadActivity extends AppCompatActivity 
{ 
    //TODO LOAD TROOPS AND TROOPMARKERS 
    //Load troops, troopmarkers, treasures and put on map 
    public List<Troop> troops; 

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_loading); 

     //Start RepositoryService 
     final RepositoryService repositoryService = new RepositoryServiceImpl("http://internco.eu", this); 

     //Load troops 
     repositoryService.loadTroops(new TroopCallback() { 
      @Override 
      public void onSuccess(List<Troop> troops) { 
       Log.d("RETROFIT", "SUCCESFULLY LOADED TROOPS SIZE: " + troops.size()); 
      } 
     }); 

     //Load troopMarkers 
     repositoryService.loadTroopMarkers(new TroopMarkerCallback() { 
      public List<TroopMarker> troopMarkers; 

      @Override 
      public void onSuccess(List<TroopMarker> troopMarkers) { 
       Log.d("RETROFIT", "SUCCESFULLY LOADED TROOPMARKERS SIZE: " + troopMarkers.size()); 
      } 
     }); 

     //Should now here when I'm done with my requests. 
     Log.d("RETROFIT", "DONE"); 
    } 
} 

Kann mir jemand darauf hinweisen? Ich denke, dass ich die RxJava-Bibliothek verwenden muss, aber ich kann das nicht herausfinden.

Ihre Hilfe wird sehr geschätzt.

+0

Ihr onSuccess zeigt an, dass die Anfrage erledigt ist. API-Aufruf ist eine asynchrone Aufgabe. –

Antwort

1

1 hacky Weg, es zu tun wäre, 2 Flag-Variablen zu halten loadTroopsflag & loadTroopMarkersflag .Dann in den onSuccess Rückrufe von jeweils prüfen, ob beide wahr sind und wenn sie dann beide Ihre Anfragen vollständig sind. Es kann Kantenfälle geben, wenn eine Workaround wie diese implementiert wird, aber es sollte in der Regel funktionieren. Im Fall hängen Ihre Anfragen auf einander dann, wie Sie also genannt verschachtelter müssen verwenden,

repositoryService.loadTroops(new TroopCallback() { 
     @Override 
     public void onSuccess(List<Troop> troops) { 
      Log.d("RETROFIT", "SUCCESFULLY LOADED TROOPS SIZE: " + troops.size()); 

      repositoryService.loadTroopMarkers(new TroopMarkerCallback() { 
      public List<TroopMarker> troopMarkers; 

      @Override 
      public void onSuccess(List<TroopMarker> troopMarkers) { 
       Log.d("RETROFIT", "SUCCESFULLY LOADED TROOPMARKERS SIZE: " + troopMarkers.size()); 
      } 
     }); 
     } 
    }); 

So etwas, so falls Sie weitere Abhängigkeiten haben, dann erhöhen Sie Ihre verschachtelte Rückrufe, die in dem Rxjava ist, würde kommen und löse es in ein paar Zeilen Code.Ich denke nicht, dass du noch in Rx springen musst, da dies ein relativ kleines Problem ist und du Rx Java zusätzlichen Platz einbringen würdest, der die Größe der App sowie die Entwicklungszeit erhöhen würde .

Beachten Sie auch den Teil, wo Sie erwähnen

//Should now here when I'm done with my requests. 
    Log.d("RETROFIT", "DONE"); 

bedeutet nicht, dass die Anforderungen fertig sind, es bedeutet einfach, dass sie in die Warteschlange gestellt und in progress.These sind asynchrone Anforderung und wird abgeschlossen, wenn der Rückruf abgeschlossen .

+1

Ich habe deinen Hack benutzt und es hat funktioniert. :) Dies ist wahrscheinlich nicht der beste und sauberste Weg, dies zu tun, aber es hat den Trick und ich muss nirgends anders machen, also ist das in Ordnung für mich. Jude Danke für die Hilfe Kumpel! –

Verwandte Themen