您能告诉我以下订阅示例有什么问题吗?
Could you tell me what's wrong with the following Subscription example?
以下订阅根本不起作用,当单击刷新按钮时。没有打印日志表明是否有任何 API 调用。
-注意事项:
使用 dagger2 完成所有依赖项,并像这样创建 Retrofit 实例:
@AppScope
@Provides
public Retrofit retrofit(OkHttpClient okHttpClient) {
return new Retrofit.Builder()
.client(okHttpClient)
.baseUrl("https://~~~~~~~~~~")
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
}
- Dagger 编译成功。
[-]在演示者中..
private final CompositeSubscription compositeSubscription = new CompositeSubscription();
...
//inside onCreate{}
compositeSubscription.add(observeRefresh());
//inside onDestroy{}
compositeSubscription.clear();
// *这是我认为有问题的部分。
private Subscription observeRefresh() {
return view.observeBtnRefresh()
.doOnNext(__ -> view.showLoading())
.observeOn(Schedulers.io())
.switchMap(__ -> model.getFoodsResponse())// [-] In model below...
.observeOn(AndroidSchedulers.mainThread())
// .doOnNext(model::saveFoodsState)
.doOnEach(__ -> view.hideLoading())
.retry()
.subscribe();
}
[-] 在视图中...
@BindView(R.id.btnRefresh)
ImageButton btnRefresh;// ButterKnife.bind(this); is Done.
..
public Observable<Void> observeBtnRefresh() {
return RxView.clicks(btnRefresh);
}
[-] 模型中
@Inject
FoodsNetwork foodsNetwork;
public Observable<Response<ResponseBody>> getFoodsResponse() {
return foodsNetwork.getFoodsResponse();
}
[-] 食品网络...
public interface FoodsNetwork {
@GET()
Observable<Response<ResponseBody>> getFoodsResponse();
}
感谢您以任何方式阅读!
将 .observeOn(Schedulers.io())
更改为 .subscribeOn(Schedulers.io())
。
您想在后台线程中完成工作,并在主线程中观察结果。有关教程,请参阅 here。
我发现了什么问题,我决定保留这个问题,因为可以让其他开发人员处理一些小事情。
API 方法(路径和一些 @Query)中遗漏了一件小事,这导致它无法正常工作
@GET(".")
Observable<Response<ResponseBody>> getFoodsResponse(@Query String query);
以下订阅根本不起作用,当单击刷新按钮时。没有打印日志表明是否有任何 API 调用。
-注意事项: 使用 dagger2 完成所有依赖项,并像这样创建 Retrofit 实例:
@AppScope
@Provides
public Retrofit retrofit(OkHttpClient okHttpClient) {
return new Retrofit.Builder()
.client(okHttpClient)
.baseUrl("https://~~~~~~~~~~")
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
}
- Dagger 编译成功。
[-]在演示者中..
private final CompositeSubscription compositeSubscription = new CompositeSubscription();
...
//inside onCreate{}
compositeSubscription.add(observeRefresh());
//inside onDestroy{}
compositeSubscription.clear();
// *这是我认为有问题的部分。
private Subscription observeRefresh() {
return view.observeBtnRefresh()
.doOnNext(__ -> view.showLoading())
.observeOn(Schedulers.io())
.switchMap(__ -> model.getFoodsResponse())// [-] In model below...
.observeOn(AndroidSchedulers.mainThread())
// .doOnNext(model::saveFoodsState)
.doOnEach(__ -> view.hideLoading())
.retry()
.subscribe();
}
[-] 在视图中...
@BindView(R.id.btnRefresh)
ImageButton btnRefresh;// ButterKnife.bind(this); is Done.
..
public Observable<Void> observeBtnRefresh() {
return RxView.clicks(btnRefresh);
}
[-] 模型中
@Inject
FoodsNetwork foodsNetwork;
public Observable<Response<ResponseBody>> getFoodsResponse() {
return foodsNetwork.getFoodsResponse();
}
[-] 食品网络...
public interface FoodsNetwork {
@GET()
Observable<Response<ResponseBody>> getFoodsResponse();
}
感谢您以任何方式阅读!
将 .observeOn(Schedulers.io())
更改为 .subscribeOn(Schedulers.io())
。
您想在后台线程中完成工作,并在主线程中观察结果。有关教程,请参阅 here。
我发现了什么问题,我决定保留这个问题,因为可以让其他开发人员处理一些小事情。 API 方法(路径和一些 @Query)中遗漏了一件小事,这导致它无法正常工作
@GET(".")
Observable<Response<ResponseBody>> getFoodsResponse(@Query String query);