- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试了解 RxJava 的改造。我见过很多关于订阅方法的不同例子,但找不到正确的解释。
第一个
Observable<PostMessage> call = service.callAPI(data);
call.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<PostMessage>(
));
第二个
Observable<PostMessage> call = service.callAPI(data);
call.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<PostMessage>(
) {
@Override
public void accept(PostMessage postMessage) throws Exception {
}
});
第三个
Observable<PostMessage> call = service.callAPI(data);
call.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new DisposableObserver<PostMessage>() {
@Override
public void onNext(PostMessage postMessage) {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
第四个
Observable<PostMessage> call = service.callAPI(data);
call.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<PostMessage>(
) {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(PostMessage postMessage) {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
任何人都可以解释一下这三种方法是什么。每个都有不同的含义还是做同样的事情?
最佳答案
1:a Schedulers.io() 用于输入输出绑定(bind)工作,它是另一个执行其工作的线程,除了它们被缓存并回收用于另一个工作(如果将来有的话)来了。
1:b AndroidSchedulers.mainThread() 因为您想在主线程上接收返回的结果。
1:c new Subscriber Subscriber订阅了Flowable并且是Observer的另一种实现。
2:新消费者接受单个值的功能接口(interface)(回调)。
3: new DisposableObserver 也是一个 Observer 但抽象的并且允许通过实现 Disposable 异步取消。
4: new Observer Observer 订阅了 Observable 并提供了一种接收基于推送的通知的机制。当 Observable 完成时将调用 onCompleted() 和 onNext() 或 OnError(),并且仅调用一次。
与 Observable 的主要区别是 new Subscriber 支持背压,而两者的工作原理几乎相同,而且 Subscriber 是 Observer 的一个实现。
订阅者和消费者的主要区别如下
Observer/Observable: The watching thread is observed by the controller. In case of an event happening, the controller is then notified and can assign the new task to a free thread from a reusable cached thread pool (or wait and cache the tasks in FIFO queue if all threads are currently busy). The worker threads implement Callable and either return successfull with the result (or a boolean value), or return with an error, in which case the controller may decide what to to (depending on the nature of error that has happended).
Producer/Consumer: The watching thread shares a BlockingQueue with the controller (event-queue) and the controller shares two with all workers (task-queue and result-queue). In case of an event, the watching thread puts a task object in the event-queue. The controller takes new tasks from the event-queue, reviews them and puts them in the task-queue. Each worker waits for new tasks and takes/consumes them from the task-queue (first come first served, managed by the queue itself), putting the results or errors back into the result-queue. Finally, the controller can retrieve the results from the result-queue and take according steps in case of errors.
来源:
What is the difference between an Observer and a Subscriber?
http://reactivex.io/RxJava/javadoc/rx/schedulers/Schedulers.html
http://reactivex.io/RxJava/javadoc/io/reactivex/functions/Consumer.html
http://reactivex.io/RxJava/javadoc/io/reactivex/observers/DisposableObserver.html
关于java - RxJava 一个 Retrofit Network 调用订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48125418/
我正在尝试迁移我的应用程序以使用 RxJava。我已经在使用 Retrofit,因此我正在尝试使用方法返回 Observables 的 Retrofit 接口(interface)。但是我现在在针对它
我想 post 数据如下: { "user_id":"14545646", "list":["4545645","4545645","4545645","4545645"]
我是改造新手。我向网站发出 POST 请求。网站以 HTML 形式返回响应。所以我会解析它。但是 Retrofit 尝试将其解析为 JSON。怎么办? @FormUrlEncoded @POST("/
我想异步执行 2 个网络调用 - 我正在使用 Retrofit+RxJava 来完成这个。这个逻辑来自一个简单的 Runner 类来测试解决方案。注意:这主要涉及服务器端的 RxJava。 我的代码如
我最近在改造的存储库中使用 Flow。 Result 的密封类 enum class ApiStatus{ SUCCESS, ERROR, LOADING } sealed c
我目前正在开发 Retrofit2 客户端的错误处理部分(使用 Retrofit 的 Rx 实现)。 找了一段时间,没有找到简单的方法将Retrofit返回的ResponseBody反序列化到我报错的
我从 retrofit 更新到 retrofit2 后出现此错误。 FATAL EXCEPTION: OkHttp Dispatcher Process: nz.co.datacom.mars.jun
在使用 RxJava 和 Retrofit 2 时,我正在尝试创建单元测试来覆盖我的应用何时收到特定响应。 我遇到的问题是,在 Retrofit 2 中,我看不到在不使用反射的情况下创建 retrof
在 Retrofit 1.9.x 中有一个 RetrofitError.Kind.NETWORK这让您可以轻松确定故障是否由网络错误引起。在新的 2.0 API 中,我们不再有 RetrofitErr
有没有办法用Refit动态输入参数? 我的 Refit 界面中有这段代码: [Get("/click?{parm}")] Task> SaveClick(string parm
有没有办法用Refit动态输入参数? 我的 Refit 界面中有这段代码: [Get("/click?{parm}")] Task> SaveClick(string parm
我知道,Retrofit 在内部使用 OkHttp。但是,我可以看到一些开发人员提供了以下方法的应用 return new Retrofit.Builder() .baseUrl(Bu
在项目上安装这个库之后: compile 'io.reactivex.rxjava2:rxandroid:2.0.1' compile 'io.reactivex.rxjava2:rxjava:2.0
在 Retrofit 1.x 中,我使用以下模式创建 API 服务类,该类模拟某些构建变体的不良网络连接。 // Retrofit 1 private T create(Class apiServi
Retrofit请求API格式(Android): @POST("getOrderStatus") @Headers("Content-Type:application/json") Obser
当我实例化 RestAdapter 时,我的应用程序总是崩溃 private void submitForm(SignupForm form){ RestAdapter adapter = n
我正要从 retrofit 1.9 迁移到最新版本并遇到问题... 我的设置: 三星 Galaxy S7 Edge(Android 7) 改造 2.3 OkHttp 3.8 迁移后突然遇到这个问题:
我正在尝试在 2.5.1-SNAPSHOT 中使用 retrofit 的协程支持,但我不断收到一个奇怪的异常。 我的改造服务类有: @GET("weather") suspend fun getFor
我正在尝试 Ktor通过转换一些当前正在使用的现有项目 Retrofit . 虽然我可以很容易地将请求转换为: client.get { url("$BASE_URL/something/so
使用改造 2,如何为上传的文件设置动态名称? 目前是这样的: @Part("avatar\"; filename=\"image\" ") RequestBody image, 但是,上传的文件名将是
我是一名优秀的程序员,十分优秀!