需要帮助实现协程,需要等待 api 响应

Need help implementing coroutines, need to wait for the api response

我的问题看起来很简单,但不知何故无法解决。我想在 api 响应后等待数组被填充。

开始 api 请求

        val job = GlobalScope.launch(IO) {
            result = viewModel.getJsonFile()!!
        }
        runBlocking {
            job.join()
            Log.e("result", result.toString()) } }
        }

下一功能

suspend fun getJsonFile(): ArrayList<String>? {
        return RetrofitClient.createClient()
    }

改装客户端

suspend fun createClient(): ArrayList<String> {
        val url = "https://jobconcursosbr.com/"
        val api = Retrofit.Builder()
                .baseUrl(url)
                .addConverterFactory(GsonConverterFactory.create())
                .build()
                .create(APIrequests::class.java)
        GlobalScope.launch ( Dispatchers.IO ) {
            val response = api.getTextData()
            if (response.isSuccessful) {
                myTitles.clear()
                for (item in response.body()!!) {
                    myTitles.add(response.body()!![i].title.rendered)
                    Log.e("meusTitulos", myTitles[i])
                    minhaDescricao.add(response.body()!![i].content.rendered)
                    i++
            }
        }
    }
        return myTitles}

得到空结果

2021-04-03 16:19:40.659 9484-9484/com.example.noticiasconcursos E/result: []
2021-04-03 16:19:43.435 9484-9546/com.example.noticiasconcursos E/meusTitulos: Processo Seletivo iNova Capixaba tem 877 vagas em vários níveis
2021-04-03 16:19:43.436 9484-9546/com.example.noticiasconcursos E/meusTitulos: ESPM disponibiliza cursos gratuitos online com certificado
2021-04-03 16:19:43.436 9484-9546/com.example.noticiasconcursos E/meusTitulos: IFPR disponibiliza cursos gratuitos de inglês básico e intermediário online
2021-04-03 16:19:43.436 9484-9546/com.example.noticiasconcursos E/meusTitulos: Senar oferece 40 cursos gratuitos de capacitação na região norte de SC

如何正确使用协程?我希望在数组填充数据后显示日志。

从您的 createClient 函数中删除协程作用域

 suspend fun createClient(): ArrayList<String> {
        val url = "https://jobconcursosbr.com/"
        val api = Retrofit.Builder()
                .baseUrl(url)
                .addConverterFactory(GsonConverterFactory.create())
                .build()
                .create(APIrequests::class.java)
            val response = api.getTextData()
            if (response.isSuccessful) {
                myTitles.clear()
                for (item in response.body()!!) {
                    myTitles.add(response.body()!![i].title.rendered)
                    Log.e("meusTitulos", myTitles[i])
                    minhaDescricao.add(response.body()!![i].content.rendered)
                    i++
            }
    }
        return myTitles}

您可以使用myTitles(实时数据)进行观察 myTitle.observe(viewLifecycleOwner, { …… })