等待使用协同程序绑定服务

时间:2018-01-22 12:43:58

标签: kotlin

所以我有一个绑定到服务的方法。

fun bindService() {
        val intent = Intent(this, BluetoothService::class.java)
        bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE)
    }

在onCreate方法中我使用此代码:

 bindService()
        launch {
            delay(500L)
            service = serviceConnection.serviceBinder?.getService() as BluetoothService
        }

等待绑定服务比使用delay()有更优雅的方式吗?

1 个答案:

答案 0 :(得分:0)

我刚刚写了这个,还没有尝试过,但是希望类似的东西可以工作。魔术在suspendCoroutine中,它会暂停当前的协程,然后为您提供延续的东西,您可以在以后继续使用它。在我们的例子中,我们在调用onServiceConnected时将其恢复。

// helper class which holds data
class BoundService(
        private val context: Context,
        val name: ComponentName?, 
        val service: IBinder?, 
        val conn: ServiceConnection) {
    fun unbind() {
        context.unbindService(conn)
    }
}

// call within a coroutine to bind service, waiting for onServiceConnected
// before the coroutine resumes
suspend fun bindServiceAndWait(context: Context, intent: Intent, flags: Int) = suspendCoroutine<BoundService> { continuation ->


    val conn = object: ServiceConnection {
        override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
            continuation.resume(BoundService(context, name, service, this))
        }
        override fun onServiceDisconnected(name: ComponentName?) {
            // ignore, not much we can do
        }

    }
    context.bindService(intent, conn, flags)
}

// just an example
suspend fun exampleUsage() {
    val bs = bindServiceAndWait(context, intent, Context.BIND_AUTO_CREATE)
    try {
        // ...do something with bs.service...
    } finally {
        bs.unbind()
    }
}