协程的使用问题


#1


需求:启动IntentService 然后在onHandleIntent方法中 上传文件,上传成功之后再将IntentService销毁,但是运行这个代码后发现,
执行玩onHandleIntent1 onHandleIntent2后,service直接调用了onDestroy方法销毁了,再5s过后,执行onHandleIntent3打印的当前的线程跟之前的也不同了
按照道理,应该是说onHandleIntent1 onHandleIntent2 然后等待5s 执行onHandleIntent3 再执行销毁ondestory的,但是现在打不到目的,delay不会阻塞当前线程,该如何做呢
@bennyhuo
@vincentlauvlwj


#2

直接使用runBlocking开启协程


#3

一、
按照道理,应该是说onHandleIntent1 onHandleIntent2 然后等待5s 执行onHandleIntent3 再执行销毁ondestory的
这个是错误的。当遇到delay(5000L)的时候,协程挂起,主线程依然运行,还没到5秒,主线程早就运行完了,程序退出,你的onHandleIntent3根本执行不到。使用runBlocking的话,会阻塞主线程
参考如下代码:

fun main() {
    GlobalScope.launch(Dispatchers.Unconfined) {
        delay(2000L)
        println("world")//这句不会执行
    }
    println("Hello")
}

二、
你使用的是Dispathcer.Unconfined,这个可以理解为你的协程会运行在启动他的线程,delay挂起后(delay会切线程),再恢复会在一个新建的Thread中运行。所以onHandleIntent3跟之前的不同了

fun main() {
    GlobalScope.launch(Dispatchers.Unconfined) {
        delay(2000L)
        println(Thread.currentThread().name)
        println("world")
    }
    println("Hello")
    Thread.sleep(3000L)
}

三、
如果你想让onHandleIntent3在主线程中运行,试试CoroutineScope(Dispatcher.Main)


#4

手动调用stop service的时候 服务销毁了 但是协程还在执行,如果让服务销毁了 协程野取消呢


京ICP备16022265号-2 Kotlin China 2017 - 2018