I have the following method to post response to UI using otto and AsyncTask
.
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();
}
I need help to convert this AsyncTask
to RxJava
using RxAndroid library.
Don't use .create() but use .defer()
Observable<File> observable = Observable.defer(new Func0<Observable<File>>() {
@Override public Observable<File> call() {
File file = downloadFile();
return Observable.just(file);
}
});
to know more details see https://speakerdeck.com/dlew/common-rxjava-mistakes
This is an example for a file download task using 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
This would download the file on a new thread and notify you on the main thread.
OnSubscribeFunc
was deprecated. Code updated to use OnSubscribe
insted. For more info see issue 802 on Github.
Code from here.
In your case you can use fromCallable
. Less code and automatic onError
emissions.
Observable<File> observable = Observable.fromCallable(new Callable<File>() {
@Override
public File call() throws Exception {
File file = downloadFile();
return file;
}
});
Using lambdas:
Observable<File> observable = Observable.fromCallable(() -> downloadFile());