【问题标题】:Data transfer between requests using Retrofit +RxJava使用 Retrofit +RxJava 的请求之间的数据传输
【发布时间】:2016-03-21 15:03:53
【问题描述】:

我决定在我的项目中使用 Retrofit 2.0 + RxJava。 主要问题是我不完全理解应该怎么做。

首先,所有请求都发往我的服务器 API,并且每个请求都必须有 accessToken。

例如,我想使用我的 API 获取所有书籍:

1.发送请求获取AccessToken请求

2.获取AccessToken值的回复

3.将此值插入getBookRequest

4.发送getBookRequest,然后得到JSONArray of books的回复

问题是我应该怎么做这个?

现在我只有获得 accessTokenValue:

的方法
public void accessToken() {
    ApiMethods methods = ApiFactory.connect();
    methods.getAccess(MAIN_URL + ACCESS_URL)
            .timeout(15, TimeUnit.SECONDS)
            .retry(3)
            .subscribeOn(Schedulers.newThread())
            .map(new Func1<List<GetAccess>, AccessToken>() {
                @NonNull
                @Override
                public AccessToken call(List<GetAccess> getAccesses) {
                    double xA = (double) getAccesses.get(0).A;
                    double xB = (double) getAccesses.get(0).B;
                    double xC = (double) getAccesses.get(0).C;
                    passDouble = //...SOME MANIPULATING WITH VALUES...//
                    id = getAccesses.get(0).ID;
                    AccessToken token = new AccessToken();
                    token.setId(String.valueOf(id));
                    token.setToken(String.valueOf(passDouble));
                    token.setIsCompleted(true);


                    return token;
                }
            })
            .onErrorReturn(new Func1<Throwable, AccessToken>() {
                @Override
                public AccessToken call(Throwable throwable) {
                    return new AccessToken(String.valueOf(id), String.valueOf(passDouble), false);
                }
            })
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Action1<AccessToken>() {
                @Override
                public void call(AccessToken accessToken) {
                    //EventBus.getDefault().post(accessToken);
                }
            });
}

我应该使用 Observable.zip 还是其他?使用第一个请求的值对我的服务器实施第二个请求的更好方法是什么?

【问题讨论】:

    标签: android rx-java observable rx-android retrofit2


    【解决方案1】:

    您的问题的解决方案是链接 2 个不同的 observable:获取访问令牌 -> 然后获取书籍列表。

    我建议让您的 accessToken 看起来像这样:

    public Observable<AccessToken> accesstoken() {
        ApiMethods methods = ApiFactory.connect();
        return methods.getAccess(MAIN_URL + ACCESS_URL)
                .timeout(15, TimeUnit.SECONDS)
                .retry(3)
                .subscribeOn(Schedulers.newThread())
                .map(new Func1<List<GetAccess>, AccessToken>() {
                    @NonNull
                    @Override
                    public AccessToken call(List<GetAccess> getAccesses) {
                        double xA = (double) getAccesses.get(0).A;
                        double xB = (double) getAccesses.get(0).B;
                        double xC = (double) getAccesses.get(0).C;
                        passDouble = //...SOME MANIPULATING WITH VALUES...//
                                id = getAccesses.get(0).ID;
                        AccessToken token = new AccessToken();
                        token.setId(String.valueOf(id));
                        token.setToken(String.valueOf(passDouble));
                        token.setIsCompleted(true);
    
    
                        return token;
                    }
                })
                .onErrorReturn(new Func1<Throwable, AccessToken>() {
                    @Override
                    public AccessToken call(Throwable throwable) {
                        return new AccessToken(String.valueOf(id), String.valueOf(passDouble), false);
                    }
                });
    }
    

    那么你可以这样使用它:

    accessToken()
            .flatMap(new Func1<AccessToken, Observable<List<Book>>>() {
                @Override
                public Observable<?> call(AccessToken accessToken) {
                    ApiMethods methods = ApiFactory.connect();
                    return methods.getBookRequest(accessToken);
                }
            })
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Action1<List<Book>>() {
                @Override
                public void call(List<Book> books) {
                    // handle your list of books
                }
            });
    

    这里的关键是 flatMap 操作符,它链接了这两个 observables。

    【讨论】:

    • 非常感谢,这正是我需要的,代码效果很好!
    猜你喜欢
    • 1970-01-01
    • 2021-09-04
    • 2016-08-15
    • 2015-10-24
    • 2019-09-21
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    相关资源
    最近更新 更多