2017-10-17 110 views
0

我正在構建一個活動,我正在從api中加載對象列表。我需要使用retrofit進行多個請求,並返回不同的對象。我可以提出請求,但我不知道如何檢查完成。Android翻新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庫,但我無法弄清楚這一點。

非常感謝您的幫助。這樣做將是

+0

Your onSuccess表示請求已完成。 API調用是一個異步任務。 –

回答

1

1哈克的方式,以保持2個標誌變量loadTroopsflag & loadTroopMarkersflag。然後在每個的onSuccess回調檢查是否都真實,如果他們是那麼你的這兩個請求完成。在實施類似這樣的解決方案時可能存在邊緣案例,但通常應該可行。如果您的請求是互相依賴的,然後,你將需要使用嵌套的,即所謂的,

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

類似的東西,所以如果你有更多的依賴性那麼你嵌套回調增加,這就是Rxjava會進來,用幾行代碼解決它。我不認爲你需要跳到Rx中,因爲這是一個相對較小的問題,而你的Rx Java帶來了額外的空間,這將增加應用程序的大小以及開發時間。

還要注意的部分,你提

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

並不意味着這些請求都做了,它只是意味着,他們正在排隊和progress.These是異步請求,回調完成時將完成。

+1

我用你的黑客,它的工作。 :)這可能不是最好也是最乾淨的方法,但它做到了訣竅,我不需要在其他地方做任何事情,所以這對我來說很好。 Jude謝謝你的幫助! –