Сопрограммы не работают в последовательности, используя async и await - PullRequest
0 голосов
/ 11 ноября 2019

У меня есть три функции, которые я хочу запустить последовательно с использованием сопрограмм.

 private fun showAnimation() {
        busy = true
        mLog.i(TAG, "showing")
        activity?.runOnUiThread {
            button.text = ""
            batchAnimation.visibility = View.VISIBLE
            batchAnimation.playAnimation()
        }

    }

 private fun hideAnimations(b: Boolean) {
    busy = false
    mLog.i(TAG, "hiding : $b ")
    activity?.runOnUiThread {
        button.text = "give feedback"
        batchAnimation.visibility = View.GONE
        batchAnimation.cancelAnimation()
    }
}

 suspend fun getBatchData(): Boolean {
        var a = false
        // network call that makes the value true when the needed data is returned else a remains false
        return a
}

Я вызываю их следующим образом

CoroutineScope(IO).launch {
            showAnimation()
            val a = async { getBatchData() }
            hideAnimations(a.await())
        }

однако функция hideanimations вызывается без ожиданиязначение второй функции

edit: добавлена ​​функция getBatch

 suspend fun getBatchData(): Boolean {
      var a  = false
        //  showAnimation()
        launch {
            context?.let {
                val dao = MDatabase(it).getUserDao()
                val trainerID = dao.getTrainerID()
                mLog.i(TAG, "trainer id $trainerID")
                json.put("trainer_id", trainerID)
                NetworkOps.post(
                    Urls.batchUrl,
                    json.toString(),
                    context,
                    view!!.feedback,
                    object : response {
                        override fun onrespose(string: String?) {
                            mLog.i(TAG, "response $string")
                            val batches = Gson().fromJson(string, DCBatches::class.java)
                            if (batches.success == "1") {
                                val batchlist = batches.batches
                                if (batchlist.isNotEmpty()) {
                                    mLog.i(TAG, "list length ${batchlist.size}")
                                   launch {
                                       context?.let { it ->
                                           val dao1 = MDatabase(it).getBatchDao()
                                           dao1.insertBatches(batchlist.toMutableList())
                                       }

                                    }
                                    mLog.i(TAG, "inserted")
                                    batchListSpinner.clear()
                                    batchListSpinner.addAll(batchlist)
                                    activity?.runOnUiThread {
                                        batchAdapter.notifyDataSetChanged()
                                        //  hideAnimations()
                                    }

                                } else {
                                    showToast("Error no batches found")
                                    //  hideAnimations()
                                }
                               mLog.i(TAG,"setting true")
                                a = true
                            } else {
                                mLog.i(TAG, "error")
                                failedBatch()
                            }
                        }

                        override fun onfailure() {
                            failedBatch()


                        }


                    }) { _, _, _ ->

                }

            }
        }
        mLog.i(TAG,"returning value")
        return a
    }

Я добавил два оператора журнала, один после задания a как true и один, когда значение возвращается вконец. Я вижу, что функция возвращает логическое значение, не дожидаясь ответа API. Как я могу это исправить?? Как отправить логическое значение из обратного вызова

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