バックエンドに接続するときにコルーチンを使用したいレガシー プロジェクトがあります。バックエンドは、Hybris が提供する SDK によって処理されています。たとえば、ボレーを使用し、いくつかのコールバックを使用します。私が望むのは、これらのコールバックをコルーチンでラップすることです。しかし、私が抱えている問題は、コルーチンが完了するのを待たず、コルーチンを開始し、次の行に進み続け、メソッドが値を返し、その後ずっとコルーチンが終了することです。私のコード:
suspend fun ServiceHelper.getList(): ListOfWishes {
return suspendCancellableCoroutine { continuation ->
getAllLists(object : ResponseReceiver<ListOfWishes> {
override fun onResponse(response: Response<ListOfWishes>?) {
continuation.resume(response?.data!!)
}
override fun onError(response: Response<ErrorList>?) {
val throwable = Throwable(Util.getFirstErrorSafe(response?.data))
continuation.resumeWithException(throwable)
}
}, RequestUtils.generateUniqueRequestId(), false, null, object : OnRequestListener {
override fun beforeRequest() {}
override fun afterRequestBeforeResponse() {}
override fun afterRequest(isDataSynced: Boolean) {}
})
}
}
ヘルパー メソッド:
suspend fun ServiceHelper.wishLists(): Deferred<ListOfWishes> {
return async(CommonPool) {
getWishList()
}
}
コルーチンが呼び出される場所:
fun getUpdatedLists(): ListOfWishes? {
val context = Injector.getContext()
val serviceHelper = Util.getContentServiceHelper(context)
var list = ListOfWishLists()
launch(Android) {
try {
list = serviceHelper.wishLists().await()
} catch (ex: Exception){
Timber.d("Error: $ex")
}
}
return list
そのため、完了するのを待つ代わりに、serviceHelper.wishLists().await()
リストを返します。また、メソッドが を返すようにしようとしましたrunBlocking{}
が、それは UI スレッドをブロックするだけで、コルーチンを終了しません。