Convert AsyncTask to RxAndroid

2019-03-12 06:55发布

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.

3条回答
家丑人穷心不美
2楼-- · 2019-03-12 07:22

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

查看更多
ら.Afraid
3楼-- · 2019-03-12 07:33

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.

查看更多
Deceive 欺骗
4楼-- · 2019-03-12 07:38

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());
查看更多
登录 后发表回答