Android 使用Observable.zip调用多个API

Android 使用Observable.zip调用多个API,android,observable,retrofit2,rx-java2,Android,Observable,Retrofit2,Rx Java2,我开发了一个RSS阅读器Android应用程序。我想调用多个API,但我不能。我的代码在这里,我做错了什么 注 响应将是XML作为字符串dasd 请求大小可能会增加(可能为10) 第三条服务生成者 object ArticleServiceGenerator { private const val FAKE_URL = "https://api.github.com" private val interceptor: HttpLoggingInterceptor = HttpLoggin

我开发了一个RSS阅读器Android应用程序。我想调用多个API,但我不能。我的代码在这里,我做错了什么

  • 响应将是XML作为字符串dasd
  • 请求大小可能会增加(可能为10)
第三条服务生成者

object ArticleServiceGenerator {

private const val FAKE_URL = "https://api.github.com"

private val interceptor: HttpLoggingInterceptor = HttpLoggingInterceptor().apply {
    level = HttpLoggingInterceptor.Level.BASIC
}

private val client: OkHttpClient = OkHttpClient.Builder().apply {
    addInterceptor(interceptor)
}.build()

private val retrofit: Retrofit = Retrofit.Builder()
    .baseUrl(FAKE_URL)
    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
    .client(client)
    .build()

val service: ArticleService = retrofit.create(ArticleService::class.java)}
服务条款

interface ArticleService {

@GET
fun getArticlesFromRss(@Url url: String): Observable<ResponseBody>}
接口服务{
@得到
趣味getArticlesFromRss(@Url:String):可观察}
和存储库

class Repository {

fun getArticlesFromRss() {
    val request: ArrayList<Observable<*>> = ArrayList()

    // The number may increase here.
    request.add(ArticleServiceGenerator.service.getArticlesFromRss("https://commonsware.com/blog/feed.atom"))
    request.add(ArticleServiceGenerator.service.getArticlesFromRss("https://jfenn.me/blog/feeds/android.xml"))
    request.add(ArticleServiceGenerator.service.getArticlesFromRss("https://arunkumar.dev/feed.xml"))

    Observable.zip(request) { Any() }
        .subscribeOn(Schedulers.io())
        .observeOn(Schedulers.newThread())
        .subscribe({
            print(it.toString())
        }) {
            print(it.toString())
        }
}}
类存储库{
有趣的getArticlesFromRss(){
val请求:ArrayList=ArrayList()
//这里的人数可能会增加。
request.add(ArticleServiceGenerator.service.getArticlesFromRss(“https://commonsware.com/blog/feed.atom"))
request.add(ArticleServiceGenerator.service.getArticlesFromRss(“https://jfenn.me/blog/feeds/android.xml"))
request.add(ArticleServiceGenerator.service.getArticlesFromRss(“https://arunkumar.dev/feed.xml"))
Observable.zip(请求){Any()}
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.newThread())
.订阅({
打印(it.toString())
}) {
打印(it.toString())
}
}}
可观察结果=Observable.zip(
observable1.subscribeOn(Schedulers.io()),
observe2.subscribeOn(Schedulers.io()),
observe3.subscribeOn(Schedulers.io()),
新功能3(){
@凌驾
公共列表应用(响应类型PE1类型1、响应类型PE2类型2、响应类型PE3类型3){
列表=新的ArrayList();
列表.添加(类型1.数据);
列表.添加(类型2.数据);
列表.添加(类型3.数据);
退货清单;
}
}
);

zip中的每个可观察对象都是按顺序执行的。将subscribeOn(Schedulers.io())添加到每个可观察到的getArticles,它将同时执行它们。

您可以尝试以下操作:

fun getArticlesFromRss() {
    val request: ArrayList<Observable<ResponseBody>> = ArrayList()
    request.add(ArticleServiceGenerator.service.getArticlesFromRss("https://commonsware.com/blog/feed.atom").subscribeOn(Schedulers.io()))
    request.add(ArticleServiceGenerator.service.getArticlesFromRss("https://jfenn.me/blog/feeds/android.xml").subscribeOn(Schedulers.io()))
    request.add(ArticleServiceGenerator.service.getArticlesFromRss("https://arunkumar.dev/feed.xml").subscribeOn(Schedulers.io()))

    Observable.zip(request){ args -> Arrays.asList(args) }
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe({
            print(it.toString())
        }) {
            print(it.toString())
        }
}}
fun getArticlesFromRss(){
val请求:ArrayList=ArrayList()
request.add(ArticleServiceGenerator.service.getArticlesFromRss(“https://commonsware.com/blog/feed.atomsubscribeOn(Schedulers.io())
request.add(ArticleServiceGenerator.service.getArticlesFromRss(“https://jfenn.me/blog/feeds/android.xmlsubscribeOn(Schedulers.io())
request.add(ArticleServiceGenerator.service.getArticlesFromRss(“https://arunkumar.dev/feed.xmlsubscribeOn(Schedulers.io())
Observable.zip(请求){args->Arrays.asList(args)}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.订阅({
打印(it.toString())
}) {
打印(it.toString())
}
}}

您只需指定默认计划程序

.addCallAdapterFactory(RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io))

这不适用于多个api调用hank@ChitanSoni,拯救我的一天。结果就在这里;它[0]
.addCallAdapterFactory(RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io))