3

バックエンドに接続するときにコルーチンを使用したいレガシー プロジェクトがあります。バックエンドは、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 スレッドをブロックするだけで、コルーチンを終了しません。

4

1 に答える 1