2015-03-30 14 views
6

У меня есть приложение Java с последовательностью вызовов api (я использую модификацию). В настоящее время это выглядит как пирамида:Как избежать обратного вызова ад в Java?

mApi.login(request, new Callback<LoginResponse>() { 
    @Override 
    public void success(LoginResponse s, Response response) { 
    mApi.getRoutes(request, new Callback<RoutesResponse>() { 
     @Override 
     public void success(RoutesResponses, Response response) { 
      ... 
     } 
     @Override 
     public void failure(RetrofitError error) {} 
    } 
    } 

    @Override 
    public void failure(RetrofitError error) {} 
}); 

Есть ли библиотеки, чтобы избежать обратного вызова ада? например, TwoStep или Q в javascript.

+0

Просто не складываются внутренние классы и методы использования для каждого шага? Или используйте механизм событий. – dube

ответ

2

Пока вы выполняете только вызовы API, вы можете использовать поддержку RxJava Retrofit, используя Observables вместо обратных вызовов и связывая их вместе с поддержкой потока Rx. В основном я использую функцию .flatmap() для преобразования результата одного вызова API в другой. В вашем случае, это было бы что-то вроде этого:

Сначала я буду использовать Наблюдаемую версию вызовов вместо тех с обратными вызовами, который будет:

Observable<LoginResponse> login(loginRequest); 
Observable<RoutesResponse> getRoutes(routesRequest); 

После того как мы имеем эти две функций в нашем API мы можем связать их вместе с потоками RxJava. Вот один без проверки ошибок, я пишу это на ходу, чтобы показать, как быстрый пример:

public Observable<RoutesResponse> rxGetRoutes(loginRequest, routesRequest) { 
    final YourAPI mAPI = YourApiProvider.getInstance(); 

    return mAPI.login(loginRequest) 
    //using flatmap to convert one answer to another answer 
    .flatmap((Func1) LoginResponse -> { 
     return mAPI.getRoutes(routesRequest); 
    }); 
} 

Теперь вы можете наблюдать и подписаться на возвращаемый Наблюдаемые этой функции, как обычно, после обучения RxJava немного:

rxGetRoutes(loginReq, routesReq) 
    .observeOn(//the thread you want to observe on) 
    .subscribe(new Subscriber<RoutesResult>() { 
      @Override 
      //the functions of Subscriber you need to override 
      //where you can also check for errors 
      //Check RxJava documentation after your IDE completes this area. 
       }); 
4

Использование lambda expressions избавятся от такого рода обратного вызова hell.But, поскольку Callback<T> интерфейса состоит из 2 абстрактных методов, вы не можете напрямую использовать лямбды. Именно здесь RxJava начинает играть. RxJava вводит более функциональный способ и позволяет использовать функциональные интерфейсы, где вы можете использовать лямбда, чтобы уменьшить аддон.

RxJava является реализация Java VM из ReactiveX (Reactive Extensions): библиотека для составления асинхронных и программ на основе событий, с помощью наблюдаемых последовательностей ...

Вот некоторые ресурсы о RxJava и лямбда.

+0

Ваши первые две ссылки сломаны @bhdrkn. Пожалуйста, разрешите. Благодарю. – oddmeter

+0

Ссылки @oddmeter обновляются! – bhdrkn

Смежные вопросы