我有以下方法使用 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
。
不要使用 .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 上的 issue 802。
根据您的情况,您可以使用
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());
我想使用返回布尔值的方法进行网络调用
首先:导入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();
}
});