2016-08-29 1 views
0

Ich verwende ein automatisch generiertes AWS Android SDK, um auf meine REST-API zuzugreifen. BeispielREST-Aufruf an RxJava migrieren und Verbindung mit einer anderen wiederverwendbaren Methode herstellen

Repos = restClient.getRepos(); 

Dieser Aufruf muss in einer Async Aufgabe sein, aber ich es in einer beobachtbaren von

final Observable reposRx = Observable.fromCallable(() -> restClient.getRepos()); 

Der http-Client, der das REST-API verwendet, verwendet ein Token zur Authentifizierung am Konvertieren, wenn ich führe eine Methode aus der REST API aus und das Token ist abgelaufen es wird einen Fehler werfen bevor ich einen REST Aufruf ausführe Ich muss überprüfen, ob das Token abgelaufen ist (Dies geschieht, indem ich einfach eine Methode einchecke, die eine Variable prüft), if es ist abgelaufen, dann muss ich es erneuern, indem ich einen anderen Async-Netzwerkanruf ausführe.

if(isTokenExpired()) { 
    refreshToken((new RefreshIdTokenCallback() { 
     @Override 
     public void onSuccess(final String idToken) 
     { 
     getRepos() 
     } 
     @Override 
     public void onFailure(final Throwable error) 
     { 
     //How to connect it with Rx 
     } 
     }); 
    } 
    else 
    { 
    getRepos() 
    } 

Also nachdem das Token erneuert ist, kann ich nun den ursprünglichen Rest-API-Aufruf ausführen.

public void getRepos() 
    { 
    reposRx 
    .subscribeOn(Schedulers.newThread()) 
    .observeOn(AndroidSchedulers.mainThread())  
    .subscribe(new Subscriber<Repos>() { 
     @Override 
     public void onCompleted() { 
     } 
     @Override 
     public void onError(final Throwable e) { 
     } 
     @Override 
     public void onNext(final Repos repos) { 
      //update the list 
     } 
    }); 
} 

Gibt es eine magische Art und Weise, alles zu RxJava zu konvertieren und auch eine Methode, die, dass ich mit all REST-API-Methoden wiederverwenden kann, die den Token Ablauf überprüft, ob Auffrischungen abgelaufen und ruft das REST-API. Und verbindet auch das onFailed? (Alle mit Rx)

+0

Verwenden Sie Retrofit für das, Es wird Ihre Antwort in Observable zurückgeben, und es wird ermöglichen, Anfrage abzufangen, um Session-Token zu aktualisieren: http://StackOverflow.com/Questions/25546934/retrofit-RXJAVA-and-Session- based-services/25551689 # 25551689 – Than

+0

Ich weiß, dass mit Retrofit ist einfacher, aber ich kann Retrofit auf diesem einen nicht verwenden, es ist die Verwendung des automatisch generierten AWS SDK für Android –

Antwort

0

keine Ahnung von der API zu haben, lassen Sie mich versuchen, einen ersten Stich an sie:

Observable<String> refresh = Observable.defer(() ->  
    Observable<String>.create(subscriber -> { 
    refreshToken(new RefreshIdTokenCallback() { 
     @Override 
     public void onSuccess(final String idToken) 
     { 
     subscriber.onNext(idToken); 
     subscriber.onComplete(); 
     } 
     @Override 
     public void onFailure(final Throwable error) 
     { 
     subscriber.onError(error); 
     } 
    }) 
    }) 
    .subscribeOn(Schedulers.newThread()) 
); 

Observable<?> checkExpiration = 
    Observable 
    .defer(() -> Observable.just(isTokenExpired())) 
    .flatMap(expired -> expired ? refresh : just("")); 

Jetzt können Sie bis zu checkExpiration Haken, wie Sie wollen; es emittiert einen einzelnen Dummy-Artikel, und Sie können das zu map oder flatMap verwenden, wie Sie möchten.

Verwandte Themen