将 AsyncTask 转换为 RxAndroid

问题描述 投票:0回答:4

我有以下方法使用 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

android android-asynctask rx-java rx-android
4个回答
13
投票

不要使用 .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


11
投票

这是使用 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 上的 issue 802。

代码来自这里。


6
投票

根据您的情况,您可以使用

fromCallable
。更少的代码和自动
onError
排放。

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

使用 lambda:

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

0
投票

我想使用返回布尔值的方法进行网络调用

首先:导入rxjava和rxandroid库:https://github.com/ReactiveX/RxAndroid

然后对于单个调用:

new SingleFromCallable<>(new Callable<Boolean>() { //return type "Boolean" from network call
        @Override
        public Boolean call() {
            return URLIsReachable(searchText); //network call
        }
    })
            .subscribeOn(Schedulers.io()) //run in background thread
            .observeOn(AndroidSchedulers.mainThread()) //handle future response in ui thread
            .subscribe(new SingleObserver<Boolean>() { //start network call
                @Override
                public void onSubscribe(@io.reactivex.rxjava3.annotations.NonNull Disposable d) {}

                @Override
                public void onSuccess(@io.reactivex.rxjava3.annotations.NonNull Boolean isValidUrl) {
                    loadingDialog.dismiss();
                    if(isValidUrl) //do future stuff on main thread
                }

                @Override
                public void onError(@io.reactivex.rxjava3.annotations.NonNull Throwable e) {
                    loadingDialog.dismiss();
                }
            });
© www.soinside.com 2019 - 2024. All rights reserved.