2015-07-23 33 views
18

Ho il seguente metodo per inviare la risposta all'interfaccia utente utilizzando otto e AsyncTask.Converti AsyncTask in 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(); 
} 

ho bisogno di aiuto per convertire questo AsyncTask-RxJava utilizzando biblioteca RxAndroid.

risposta

13

Non utilizzare .create(), ma usano .defer()

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

    File file = downloadFile(); 

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

di conoscere maggiori dettagli si veda https://speakerdeck.com/dlew/common-rxjava-mistakes

+0

Questo mi sembra un po 'imbarazzante. Sta creando un Observable che emette il file già scaricato, che differendo la creazione sembra essere eseguito in background. Credo che Observable.fromCallable sarebbe più appropriato. – Zackline

11

Questo è un esempio per un compito download di file utilizzando RxJava

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(); 
     } 
    }); 
} 

Usage:

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

Ciò scaricare il file su un nuovo thread e di notifica sul thread principale.

OnSubscribeFunc è stato dichiarato obsoleto. Codice aggiornato per utilizzare OnSubscribe insted. Per maggiori informazioni visita issue 802 on Github.

Code from here.

+0

Non posso usare questo codice, perché: "Errore: non riesce a trovare il simbolo di classe OnSubscribeFunc" e nella mia Gradle ho compilare 'io.reactivex: rxandroid: 1.0. 1 'e compila' io.reactivex: rxjava: 1.0.14 ' –

+0

@JachumbelechaoUntoMantekilla 'OnSubscribeFunc' è stato dichiarato obsoleto. Puoi invece usare 'OnSubscribe'. Ho aggiornato la mia risposta e collegato al problema github pertinente. – LordRaydenMK

+0

e su come annullare l'iscrizione? È necessario se l'attività corrente non è terminata a breve. destra? – shijin

6

Nel tuo caso è possibile utilizzare fromCallable. Meno codice e emissioni automatiche onError.

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

Uso lambda:

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