2017-10-17 111 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谢谢你的帮助! –