java - 使用 RxJava 进行改造时处理额外的 observable

标签 java android rx-java reactive-programming rx-android

我正在使用 RxAndroid,由于两个可观察结果,我想执行一个改造请求。所以我使用 zip 运算符

Observable<RequestBuilder> obs = a.zipWith(b, (lhs, rhs) -> builder.b(rhs).a(lhs));

现在这里的问题是 builder.build() 返回另一个可观察的 ObservableRequest 但这个方法现在使它成为 ObservableObservableRequest ,我似乎无法弄清楚。我已经这样做了,但我想正确地做...

obs.map(
(builder) -> builder.build(api)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::setData)
);

也许是这样的

    obs.map((builder) -> builder.build(api))
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::setData);

最佳答案

调试,这可能有帮助。

login RestPresenter中的方法类

public void login(String email, String password) {
        mRestService.getApi()
                .postAuth(email, password, "") //create Observable
                .timeout(TIMEOUT_IN_SECONDS, TimeUnit.SECONDS) //time out
                .retry(RETRY_COUNT_FOR_REQUEST) //times to retry
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<AuthBean>() { // your model
                    @Override
                    public void onCompleted() {
                        // do nothing
                    }

                    @Override
                    public void onError(Throwable e) {
                        mView.showError("Error");
                    }

                    @Override
                    public void onNext(AuthBean posts) {
                        mView.workWithLoginResponse(posts);
                    }
                });
}

在您的 activity 中调用它

RestService mRestService = new RestService();
mRestPresenter = new RestPresenter(YourActivity.this, mRestService);
mRestPresenter.login(email, password);

RestService类可能看起来像这样

public class RestService {
    private ProviderApi mProviderApi;
    private long CONNECTION_TIMEOUT_IN_SECONDS = 15L;
    private long READ_TIMEOUT_IN_SECONDS       = 15L;
    private long WRITE_TIMEOUT_IN_SECONDS      = 25L;

    public RestService() {
        RequestInterceptor requestInterceptor = new RequestInterceptor() {
            @Override
            public void intercept(RequestFacade request) {
                request.addHeader("Accept", "application/json");
            }
        };
        RestAdapter restAdapter = new RestAdapter.Builder()
                .setEndpoint(Config.URL_SERVER)
                .setRequestInterceptor(requestInterceptor)
                .setLogLevel(RestAdapter.LogLevel.FULL)
                .setClient(new OkClient(getClient())) // need square/okhttp
                .build();
        mProviderApi = restAdapter.create(ProviderApi.class);
    }

    private OkHttpClient getClient() {
        OkHttpClient client = new OkHttpClient();
        client.setConnectTimeout(CONNECTION_TIMEOUT_IN_SECONDS, TimeUnit.MINUTES);
        client.setReadTimeout(READ_TIMEOUT_IN_SECONDS, TimeUnit.MINUTES);
        client.setWriteTimeout(WRITE_TIMEOUT_IN_SECONDS, TimeUnit.MINUTES);
        return client;
    }

    public ProviderApi getApi() {
        return mProviderApi;
    }
}

mView是你的activity ,所以您只需创建 workWithLoginResponse方法并使用服务器应答执行您想要的操作。

还有ProviderApi是接口(interface),可能包含如下内容:

@FormUrlEncoded
@POST("/auth")
Observable<AuthBean>
postAuth(@Field("login") String login,
         @Field("password") String password);

关于java - 使用 RxJava 进行改造时处理额外的 observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35256833/

相关文章:

android - 获取 20 个字符的哈希键而不是 28 个用于 facebook 与 android 的集成

java - 从 Android 上的外部存储获取所有 .pdf 文件

android - Google 是否更改了应用内结算测试设置

java - RxJava 和观察者代码的并行执行

java - RxAndroid -BehaviorSubject 未在 onNext 上发出

java - 将 PDFBox 中的行附加到现有页面时坐标错误

java - 使用 JIRA 进行身份验证

java - java 的 fileWriter() 函数是否适用于 Linux 类型的机器?

java - 我怎样才能获得符号的所有组合(如何迭代这个数组)?

android - RxJava 和 Retrofit - 根据服务器响应引发自定义异常