2016-03-06 21 views
6

Tôi có hai phương thức REST khác nhau và tôi muốn gọi chúng cùng một lúc. Làm thế nào tôi có thể làm điều này trong Retrofit 2?Làm thế nào tôi có thể gọi nhiều yêu cầu cùng một lúc trong Retrofit 2

Tôi có thể gọi cho từng người một, nhưng có phương pháp được đề xuất nào để trang bị thêm không?

tôi mong đợi một cái gì đó như:

Call<...> call1 = myService.getCall1(); 
Call<...> call2 = myService.getCall2(); 

MagicRetrofit.call (call1,call2,new Callback(...) {...}); // and this calls them at the same time, but give me result with one method 

Trả lời

7

tôi sẽ xem xét sử dụng RxJava với Retrofit. Tôi thích hàm Zip, but there's a ton of others. Dưới đây là một ví dụ về Zip sử dụng Java 8:

odds = Observable.from([1, 3, 5, 7, 9]); 
evens = Observable.from([2, 4, 6]); 

Observable.zip(odds, evens, {o, e -> [o, e]}).subscribe(
    { println(it); },       // onNext 
    { println("Error: " + it.getMessage()); }, // onError 
    { println("Sequence complete"); }   // onCompleted 
); 

mà kết quả trong

[1, 2] 
[3, 4] 
[5, 6] 
Sequence complete 

Retrofit không nên nhiều khó khăn hơn.

Đối tượng dịch vụ trang bị thêm của bạn phải trả lại Observable<...> hoặc Observable<Result<...>> nếu bạn muốn mã trạng thái.

Sau đó, bạn muốn gọi:

Observable.zip(
    getMyRetrofitService().getCall1(), 
    getMyRetrofitService().getCall2(), 
    (result1, result2) -> return [result1,result2]) 
    .subscribe(combinedResults -> //Combined! Do something fancy here.) 
+0

nếu 1 yêu cầu thất bại, sẽ nó dừng toàn bộ quá trình thi hành? @bkach? – ericn

+0

Đối với các mã trạng thái HTTP: Với Retrofit 1, có nó sẽ ngừng thực hiện và ném một ngoại lệ. Với Retrofit 2 nó không. [Nguồn (theo yêu cầu thực hiện)] (https://futurestud.io/tutorials/retrofit-2-upgrade-guide-from-1-9). Nếu không - trên bất kỳ "thất bại" khác (tai nạn, vv) - có nó sẽ ngừng thực hiện và ném ngoại lệ. Điều này có thể được xử lý trong 'onError' mà tôi chưa thực hiện trong ví dụ trên. – bkach

0

Bạn có thể thêm cả cuộc gọi trong một bộ sưu tập và sử dụng parallelStream của Java8 để làm cho hai cuộc gọi song song

Arrays.asList(myService.getCall1(), myService.getCall2()).parallelStream().map(call->call.request()); 
Các vấn đề liên quan