繁体   English   中英

使用翻新+ RxJava在请求之间进行数据传输

[英]Data transfer between requests using Retrofit +RxJava

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

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

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

1.发送请求以获取AccessToken请求

2.获取具有AccessToken值的回复

3.将此值插入getBookRequest

4,发送getBookRequest,然后用JSONArray的书获取回复

问题是我应该怎么做?

现在我只有获取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还是其他? 用第一个请求中的值对我的服务器实施第二个请求的更好方法是什么?

解决您的问题的方法是将2个不同的可观察对象链接起来:获取访问令牌->然后获取书籍列表。

我建议使您的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运算符,它链接了这两个可观察对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM