将AsyncTask转换为RxAndroid

我有以下方法使用otto和AsyncTask发布对UI的响应。

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

我需要帮助,使用RxAndroid库将此AsyncTask转换为RxJava

Solutions Collecting From Web of "将AsyncTask转换为RxAndroid"

不要使用.create(),但使用.defer()

 Observable<File> observable = Observable.defer(new Func0<Observable<File>>() { @Override public Observable<File> call() { File file = downloadFile(); return Observable.just(file); } }); 

要了解更多细节,请参阅https://speakerdeck.com/dlew/common-rxjava-mistakes

这是使用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(); } }); } 

用法:

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

这将在新线程上下载文件并在主线程上通知您。

OnSubscribeFunc已被弃用。 代码更新为使用OnSubscribe 。 有关更多信息,请参阅Github上的问题802。

代码从这里。

在你的情况下,你可以使用fromCallable 。 较less的代码和自动onError排放。

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

使用lambdas:

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