2015-07-23 19 views
18

Ich habe die folgende Methode, Antwort auf UI mit otto und AsyncTask zu buchen.Konvertieren von AsyncTask zu RxAndroid

private static void onGetLatestStoryCollectionSuccess(final StoryCollection storyCollection, final Bus bus) { 
    new AsyncTask<Void, Void, Void>() { 
     @Override 
     protected Void doInBackground(Void... params) { 
      bus.post(new LatestStoryCollectionResponse(storyCollection)); 
      return null; 
     } 
    }.execute(); 
} 

Ich brauche Hilfe dieses AsyncTask-RxJava mit RxAndroid Bibliothek zu konvertieren.

Antwort

13

Verwenden .Create nicht(), aber verwenden .defer()

Observable<File> observable = Observable.defer(new Func0<Observable<File>>() { 
    @Override public Observable<File> call() { 

    File file = downloadFile(); 

    return Observable.just(file); 
    } 
}); 

mehr Details wissen sehen https://speakerdeck.com/dlew/common-rxjava-mistakes

+0

Das scheint mir ein wenig peinlich. Es wird ein Observable erstellt, das die bereits heruntergeladene Datei ausgibt, die durch die Verzögerung der Erstellung im Hintergrund ausgeführt wird. Ich glaube, dass Observable.fromCallable angemessener wäre. – Zackline

11

Dies ist ein Beispiel für ein Download-Task-Datei RxJava mit

Observable<File> downloadFileObservable() { 
    return Observable.create(new OnSubscribeFunc<File>() { 
     @Override 
     public Subscription onSubscribe(Observer<? super File> fileObserver) { 
      try { 
       byte[] fileContent = downloadFile(); 
       File file = writeToFile(fileContent); 
       fileObserver.onNext(file); 
       fileObserver.onCompleted(); 
      } catch (Exception e) { 
       fileObserver.onError(e); 
      } 
      return Subscriptions.empty(); 
     } 
    }); 
} 

Verbrauch:

downloadFileObservable() 
    .subscribeOn(Schedulers.newThread()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(observer); // you can post your event to Otto here 

Diese Datei auf einen neuen Thread downloaden würde und Sie auf dem Haupt-Thread mitteilen.

OnSubscribeFunc wurde veraltet. Code aktualisiert, um OnSubscribe zu verwenden. Für weitere Informationen siehe issue 802 on Github.

Code from here.

+0

Ich kann nicht diesen Code verwenden, weil: und in meinem gradle Ich habe kompilieren ‚io.reactivex: "Fehler nicht Symbolklasse OnSubscribeFunc finden": rxandroid: 1,0. 1 'und kompilieren' io.reactivex: rxjava: 1.0.14 ' –

+0

@JachumbelechaoUntoMantekilla 'OnSubscribeFunc' war veraltet. Sie können stattdessen 'OnSubscribe' verwenden. Ich habe meine Antwort aktualisiert und bin mit dem entsprechenden GitHub-Problem verknüpft. – LordRaydenMK

+0

Was ist mit dem Abbestellen? Es ist notwendig, wenn die aktuelle Aktivität wenn nicht bald beendet wird. Recht? – shijin

6

In Ihrem Fall können Sie Verwenden Sie fromCallable. Weniger Code und automatische onError Emissionen.

Observable<File> observable = Observable.fromCallable(new Callable<File>() { 
     @Override 
     public File call() throws Exception { 
      File file = downloadFile(); 
      return file; 
     } 
    }); 

Mit lambdas:

Observable<File> observable = Observable.fromCallable(() -> downloadFile());