我刚开始使用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
在不同的线程上运行?有办法吗?
答案 0 :(得分:0)
这可能发生的唯一原因是subscribeOn
(与observeOn
相反)只能被调用一次。具体来说,第一个subscribeOn
调用将起作用,其他调用(或此流上的运算符用法)将被忽略。确保subscribeOn
未在此流的任何其他地方调用它。