2017-10-17 17 views
0

APIからオブジェクトのリストを読み込むアクティビティを構築中です。私は別のオブジェクトを返すretrofitで複数のリクエストを行う必要があります。私は要求をすることができますが、私は彼らが完了したときにどのように確認できるかわかりません。Android Retrofit 2複数のリクエストを待つ

次のコードは私が持っているものです。

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"); 
    } 
} 

誰かが私にこれを指摘できますか?私はRxJavaライブラリを使用しなければならないと思いますが、これを理解することはできません。

お手数をおかけします。

それを行うための1つのハック方法は2つのフラグ変数を維持するだろう
+0

onSuccessは、要求が完了したことを示します。 APIコールは非同期タスクです。 –

答えて

1

loadTroopsflag & loadTroopMarkersflag .ThenそれぞれのするonSuccessコールバックで両方に該当すると、彼らは、あなたの要求の両方である場合に完了しているかどうかを確認してください。このような回避策を実装する際にはエッジケースがあるかもしれませんが、一般的にはうまくいくはずです。 Rxjavaがで来るところであるあなたはすなわちと呼ばれる入れ子に使用する必要がありますように、ケースには、あなたがより多くの依存関係を持っているので、ケースであなたの要求は、

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()); 
      } 
     }); 
     } 
    }); 

、その後、お互いにそのような何かに依存、あなたのネストされたコールバックの増加とコードのいくつかの行でそれを解決します。あなたはRxにジャンプする必要はないと思うが、これは比較的小さな問題であり、Rx Javaはアプリケーションのサイズと開発時間を増やす余分なスペースをもたらします。

また、あなたが

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

は、要求が行われていることを意味するものではありません、それは単にそれらがキューに登録されていることを意味し、progress.Theseに非同期要求され、コールバックが完了すると完了します言及部分に注意してください。

+1

私はあなたのハックを使用し、それは働いた。 :)これはおそらく、これを行うための最善の、最もクリーンな方法ではありませんが、それはトリックを行い、私はこれでいいですので、私はそれ以外の場所で行う必要はありません。 ジュードヘルプメイトありがとう! –

関連する問題