2016-09-15 62 views
1

我想看看如何對異步(=非阻塞)RESTful Volley請求鏈進行排序的Android java示例。回調地獄:排序RESTful排球請求? RxAndroid?

這是RxAndroid的用途嗎?

  • 如果是這樣,我想看看使用RxAndroid的例子。
  • 如果不是,我還是希望看到一個很好的例子,不要跳入CALLBACK HELL!

我試圖這樣做,但在CBHell結束了: Need to send multiple Volley Requests - in a sequence

我想從我的第一個要求我的結果在第二個請求中使用。然後我要在第三個請求中使用第二個請求的結果。請問,我如何鏈接這些Volley請求?

回答

3

您可以使用Rx通過使用flatMap方法鏈接多個請求。

flatMap要求您返回另一個Observable您的選擇類型,因此您可以使用另一種類型進行異步操作。

以下所有示例均使用新的rx v2進行製作。但所有的方法和機制也適用於V1

例子:

final MyVolleyApi api = new MyVolleyApi(); 

api.getName() 
.subscribeOn(Schedulers.io()) 
.observeOn(AndroidSchedulers.mainThread()) 
.flatMap(new Function<String, ObservableSource<Integer>>() { 
    @Override 
    public ObservableSource<Integer> apply(String name) throws Exception { 
     return api.getAgeForName(name); 
    } 
}) 
.flatMap(new Function<Integer, ObservableSource<Date>>() { 
    @Override 
    public ObservableSource<Date> apply(Integer age) throws Exception { 
     return api.getYearOfBirthForAge(age); 
    } 
}) 
.doOnError(new Consumer<Throwable>() { 
    @Override 
    public void accept(Throwable throwable) throws Exception { 
     // handle the exception that occurred during one of the api calls 
    } 
}) 
.subscribe(new Consumer<Date>() { 
    @Override 
    public void accept(Date date) throws Exception { 
     // do something with the 3rd argument here 
    } 
}); 

這是MyVolleyApi啞類:

public class MyVolleyApi { 

    public Observable<String> getName() { 
     return Observable.just("Rx"); 
    } 

    public Observable<Integer> getAgeForName(String name) { 
     return Observable.just(24); 
    } 

    public Observable<Date> getYearOfBirthForAge(int age) { 
     return Observable.just(new Date()); 
    } 
} 

這可以應用到任何東西,它不是在所有

volely具體
+0

反正有,我可以使用這個連續的異步調用LiveData改造 –