gpt4 book ai didi

android - 使用 Retrofit +RxJava 在请求之间传输数据

转载 作者:搜寻专家 更新时间:2023-11-01 08:36:46 25 4
gpt4 key购买 nike

我决定在我的项目中使用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 还是其他什么?使用第一个请求的值向我的服务器实现第二个请求的更好方法是什么?

最佳答案

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

我建议让您的 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
}
});

这里的关键是链接这两个 observable 的 flatMap 运算符。

关于android - 使用 Retrofit +RxJava 在请求之间传输数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36134601/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com