当 rxjava 工作时,主要功能已死。请任何解决方案
main function is dead while rxjava is working. any solution please
我正在尝试使用 RXjava access_token。
我 运行 程序并调用了请求 access_token 的函数,但进程以代码 0 结束。
我认为主线程在连接服务器时挂掉了
我的解决方案是
Thread.sleep(sometime)
给短时间得到回应。
我也试过了
val runnable = Runnable{ getToken() }
val thread = Thread(runnable)
thread.run()
thread.join()
但是没用..
下面是我的代码
fun main(args : Array<String>) {
getToken()
// Thread.sleep(10000) // it works but don't want to do with this
}
fun getToken() {
val id = "test"
val pw = "test"
println(id + " " + pw)
val oAuthService = Retrofit.Builder()
.baseUrl(URL)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.client(httpClient)
.build()
.create(OAuthService::class.java)
oAuthService.getAccessToken(
CLIENT_ID,
CLIENT_SECRET,
id,
pw
).subscribeOn(Schedulers.io())
.flatMap {
when(it.error){
null -> Single.just(TokenDto.Success(it.access_token?:"", it.expires_int?:0, it.token_type?:"", it.refresh_token?:""))
else -> Single.just(TokenDto.Failure("failed"))
}
}
.retry { times, throwable ->
println(throwable)
times < 3 }
.subscribeBy(
onSuccess = {
println("onSuccess")
when(it){
is TokenDto.Success -> {
println("accessToken : ${it.access_token}")
}
is TokenDto.Failure -> {
println("failed : ${it.msg}")
}
}
},
onError = {
println("onError")
}
)
}
改造
interface OAuthService {
@FormUrlEncoded
@POST("oauth2/token")
fun getAccessToken(
@Field("client_id") client_id:String,
@Field("client_secret") client_secret:String,
@Field("username") username:String,
@Field("password") password:String
):Single<TokenResponse>
您对 getAccessToken
的订阅是异步的。这意味着 subscribeBy
returns 立即终止,然后您的主线程终止,因为它无事可做。如果您有 Observable
,则可以使用 blockingSubscribeBy
;如果您使用 Single
,则可以使用 blockingGet
。两家运营商都应阻止订阅。
我也想澄清一下,阻塞是不好的,你应该避免它。具体来说,在你的情况下,没关系,因为你想阻止主函数的执行,它是你程序的 "end of the world"。
我正在尝试使用 RXjava access_token。
我 运行 程序并调用了请求 access_token 的函数,但进程以代码 0 结束。
我认为主线程在连接服务器时挂掉了
我的解决方案是
Thread.sleep(sometime)
给短时间得到回应。
我也试过了
val runnable = Runnable{ getToken() }
val thread = Thread(runnable)
thread.run()
thread.join()
但是没用..
下面是我的代码
fun main(args : Array<String>) {
getToken()
// Thread.sleep(10000) // it works but don't want to do with this
}
fun getToken() {
val id = "test"
val pw = "test"
println(id + " " + pw)
val oAuthService = Retrofit.Builder()
.baseUrl(URL)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.client(httpClient)
.build()
.create(OAuthService::class.java)
oAuthService.getAccessToken(
CLIENT_ID,
CLIENT_SECRET,
id,
pw
).subscribeOn(Schedulers.io())
.flatMap {
when(it.error){
null -> Single.just(TokenDto.Success(it.access_token?:"", it.expires_int?:0, it.token_type?:"", it.refresh_token?:""))
else -> Single.just(TokenDto.Failure("failed"))
}
}
.retry { times, throwable ->
println(throwable)
times < 3 }
.subscribeBy(
onSuccess = {
println("onSuccess")
when(it){
is TokenDto.Success -> {
println("accessToken : ${it.access_token}")
}
is TokenDto.Failure -> {
println("failed : ${it.msg}")
}
}
},
onError = {
println("onError")
}
)
}
改造
interface OAuthService {
@FormUrlEncoded
@POST("oauth2/token")
fun getAccessToken(
@Field("client_id") client_id:String,
@Field("client_secret") client_secret:String,
@Field("username") username:String,
@Field("password") password:String
):Single<TokenResponse>
您对 getAccessToken
的订阅是异步的。这意味着 subscribeBy
returns 立即终止,然后您的主线程终止,因为它无事可做。如果您有 Observable
,则可以使用 blockingSubscribeBy
;如果您使用 Single
,则可以使用 blockingGet
。两家运营商都应阻止订阅。
我也想澄清一下,阻塞是不好的,你应该避免它。具体来说,在你的情况下,没关系,因为你想阻止主函数的执行,它是你程序的 "end of the world"。