当 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"。