Как использовать вложенный Suspend в Kotlin android - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть эта функция в Kotlin:

class DictionaryWorker constructor(
    context: Context,
    private val workerParameters: WorkerParameters,
    private val apiInterface: ApiInterface
) :
    KneuraWorker(context, workerParameters), BaseDataSource {

    private var isJobSuccess: Boolean = false

    override suspend fun doWorkerJob(): Result = withContext(Dispatchers.IO) {


        val call = apiInterface.downloadDictionaryFille(DICTIONARY_FILE_URL)

        call!!.enqueue(object : Callback<ResponseBody?> {
            override fun onResponse(
                call: Call<ResponseBody?>?,
                response: Response<ResponseBody?>
            ) {

                if (response.isSuccessful) {

                } else {
                    Log.d("TAG", "server contact failed")
                    isJobSuccess = false
                }
            }

            override fun onFailure(call: Call<ResponseBody?>?, t: Throwable?) { }

        })


        return@withContext if (isJobSuccess)
            Result.success()
        else
            Result.failure()
    }



}

Что сейчас происходит :

До этого block-1 ниже

call!!.enqueue(object : Callback<ResponseBody?> {
            override fun onResponse(
                call: Call<ResponseBody?>?,
                response: Response<ResponseBody?>
            ) {

                if (response.isSuccessful) {

                } else {
                    Log.d("TAG", "server contact failed")
                    isJobSuccess = false
                }
            }

            override fun onFailure(call: Call<ResponseBody?>?, t: Throwable?) { }

        })

Этот block-2 выполняет

return@withContext if (isJobSuccess)
            Result.success()
        else
            Result.failure()

Что я пытаюсь сделать

Убедитесь, что только после выполнения block 1 block 2

1 Ответ

0 голосов
/ 20 апреля 2020

Не уверен, что вызов !!. Enqueue () делает, но вполне вероятно, что он запускает другой поток и выполняет свою работу асинхронно.

Так что block 2 не ждет, пока block 1 не будет завершено.

Действительно ужасным способом (который я не рекомендую) обрабатывать это было бы использование CountDownLatch.

Но я бы лучше добавил обратный вызов для doWorkerJob ():

override fun doWorkerJob(callback: (Result) -> Unit) {


        val call = apiInterface.downloadDictionaryFille(DICTIONARY_FILE_URL)

        if (call == null) {
           callback(Result.failure())
        }

        call?.enqueue(object : Callback<ResponseBody?> {
            override fun onResponse(
                call: Call<ResponseBody?>?,
                response: Response<ResponseBody?>
            ) {

                if (response.isSuccessful) {
                   callback(Result.success())
                } else {
                    Log.d("TAG", "server contact failed")
                    callback(Result.failure())
                }
            }

            override fun onFailure(call: Call<ResponseBody?>?, t: Throwable?) {
                callback(Result.failure())
            }

        })

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...