Reputation: 1386
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.
Upvotes: 19
Views: 8641
Reputation: 11058
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());
Upvotes: 6
Reputation: 13321
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.
Upvotes: 11
Reputation: 1351
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
Upvotes: 13