android - 如何使用 RxJava2 + Retrofit2 一次进行多个网络调用
问题描述
我正在使用多个 api 调用从服务器获取数据,因为我正在使用 Retrofit@ 和 RxJava2。在我的 api 服务类中,我有 2 个获取请求,并且它们都单独运行,因为这些数据没有完全到来。我想获取所有数据从两个 apis 一起获取。目前我正在获取类似这样的数据,我想要一些更好的方法来处理多个 api 调用。
下面是我的代码:
ApiService.class
public interface ApiService {
@GET("Categoery_api")
Observable<List<MenuModel>> getData();
@GET("Recent_six_post_api")
Observable<List<FlashStoryModel>> getFlashStory();
}
MainActivity.java
private void getMenu(){
Retrofit retrofit = RetrofitClient.getInstance();
ApiService myApi = retrofit.create(ApiService.class);
myApi.getData().subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<List<MenuModel>>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(List<MenuModel> menuModels) {
if(menuModels.size() > 0){
menuProg.setVisibility(View.INVISIBLE);
list.addAll(menuModels);
adapter = new MenuAdapter(list,getApplicationContext());
menuRecycler.setAdapter(adapter);
}
}
@Override
public void onError(Throwable e) {
menuProg.setVisibility(View.INVISIBLE);
Toast.makeText(getApplicationContext(),e.getMessage(),Toast.LENGTH_SHORT).show();
}
@Override
public void onComplete() {
}
});
}
private void getFlashStory(){
Retrofit retrofit = RetrofitClient.getInstance();
ApiService apiService = retrofit.create(ApiService.class);
apiService.getFlashStory().subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<List<FlashStoryModel>>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(List<FlashStoryModel> flashStoryModels) {
if(flashStoryModels.size() > 0){
prog1.setVisibility(View.INVISIBLE);
storyList.addAll(flashStoryModels);
flashStoryAdapter = new FlashStoryAdapter(getActivity(),storyList);
flashStory.setAdapter(flashStoryAdapter);
final Handler handler = new Handler();
final Runnable update = new Runnable() {
@Override
public void run() {
if (currentPage == 6) {
currentPage = 0;
}
flashStory.setCurrentItem(currentPage++, true);
}
};
timer = new Timer(); // This will create a new Thread
timer.schedule(new TimerTask() { // task to be scheduled
@Override
public void run() {
handler.post(update);
}
}, DELAY_MS, PERIOD_MS);
}
}
@Override
public void onError(Throwable e) {
prog1.setVisibility(View.INVISIBLE);
Toast.makeText(getActivity(),e.getMessage(),Toast.LENGTH_SHORT).show();
}
@Override
public void onComplete() {
}
});
}
有人请让我知道我怎样才能达到预期的结果。任何帮助将不胜感激。
谢谢
解决方案
利用Observable.zip(...)
Observable.zip(
apiService.getFlashStory(),
apiService.getData(),
BiFunction< List<FlashStoryModel>, List<MenuModel>, Unit> { r1, r2, _ ->
// r1 is result from apiService.getFlashStory()
// r2 is result from apiService.getData()
// Do something here.
// For example, this is what your code do above for apiService.getData()
if(r2.size() > 0){
menuProg.setVisibility(View.INVISIBLE);
list.addAll(r2);
adapter = new MenuAdapter(list,getApplicationContext());
menuRecycler.setAdapter(adapter);
}
}
).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
这是实际的 BiFunction。
object: BiFunction<P, Q, R> {
override fun apply(t1: P, t2: Q): R {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
}
但我把它写成。
BiFunction<P, Q, R> { r1, r2, returnValue ->
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
推荐阅读
- javascript - 如何在 Array.prototype.map 中使用 await 来等待 RxJS Observables
- c++ - 将 C++ 中的数组转换为字符串
- android - Android:ConstraintLayout 尺寸比例+宽度百分比
- mysql - 用于查找记录所有者的 Db 模式
- javascript - Flutter 监听 js 消息
- nginx - NGINX:无法将 phpmyadmin 路由上的 IP 列表列入白名单
- php - CKFinder - 无法识别会话变量。PHP
- c++ - Visual C++ GC 接口如何启用它以及包含哪个库
- arrays - 如何在 Go 中将任何数据类型转换为字节
- git - 无法一次添加所有文件,但可以在 git 中单独添加