改造2,Rx 2和异步调用

时间:2017-12-01 13:11:11

标签: kotlin retrofit rx-java2

我刚开始使用Retrofit和Rx并创建了一个微笑API,这样(Kodein)配置:

bind<CallAdapter.Factory>() with singleton {
    RxJava2CallAdapterFactory.create()
}

bind<RetrofitInterface>() with singleton {
    val retrofit = Retrofit.Builder()
            .client(instance())
            .baseUrl(instance<String>("apiRoot"))
            .addCallAdapterFactory(instance())
            .addConverterFactory(instance())
            .build()

    retrofit.create(RetrofitInterface::class.java)
}

现在看来,当我调用由Retrofit创建的API方法时,它们会在当前线程上订阅,而不是在.subscribeOn(someThread)中设置的线程,就像我调用时一样:

    registrationSession(mUserName, PublicKeyType.XXXX, TargetType.YYYY)
            .subscribeOn(io.reactivex.schedulers.Schedulers.newThread())
            ...
            .subscribe(
                    {

                    },
                    { error ->
                        Log.e("Error", error.message)
                    }
            )

提供的改造registrationSession将在主线程上立即调用请求,而不是在我订阅时,我不会期望(但是再次 - 我只是从Rx开始,我可能是错的)

万一你想知道如何定义registrationSession,这是一个简单的函数包装:

@POST("registration/session")
fun registrationSession(
        @Header(Constants.LB_DEVICEID_HEADER) deviceUuid: String,
        @Body registrationSessionPost: RegistrationSessionPost
): Observable<Response>

那么我该怎样做才能使registrationSession在不同的线程上运行?有办法吗?

1 个答案:

答案 0 :(得分:0)

这可能发生的唯一原因是subscribeOn(与observeOn相反)只能被调用一次。具体来说,第一个subscribeOn调用将起作用,其他调用(或此流上的运算符用法)将被忽略。确保subscribeOn未在此流的任何其他地方调用它。