Ожидание завершения потока OkHttp Call - PullRequest
0 голосов
/ 13 января 2019

У меня были проблемы с OkHttp , когда я вложил вызов OkHttp в другой вызов OkHttp У меня возникла проблема с параллелизмом. Я хочу дождаться, пока мой внутренний вызов завершит работу своего потока, прежде чем продолжить. Пожалуйста, взгляните.

Примечание: я новичок в Kotlin и многопоточности.

   private fun parseJson(url: String) {
        val request = Request.Builder()
           .url(url)
           .build()

    client.newCall(request).enqueue(object : Callback {
        override fun onResponse(call: Call, response: Response?) {
            var bodyOfProducts = response?.body()?.string()

            var collectionJsonObject = jsonParseTool.fromJson(bodyOfProducts, Products::class.java)

            val productsWithDetails = ArrayList<ProductDetails>()


               for(product in collectionJsonObject.collects){
                   var concatProductUrl = "https://shopicruit.myshopify.com/admin/products.json?ids=" + product.product_id+ "&page=1&access_token=c32313df0d0ef512ca64d5b336a0d7c6"

                   val newRequest = Request.Builder()
                       .url(concatProductUrl)
                       .build()

                   val job = thread {
                       client.newCall(newRequest).enqueue(object : Callback {
                           override fun onResponse(call: Call, newResponse: Response?) {
                               var bodyOfProductDetails = newResponse?.body()?.string()
                               var productJsonObject = jsonParseTool.fromJson(bodyOfProductDetails, ProductDetails::class.java)
                               productsWithDetails.add(productJsonObject)
                           }

                           override fun onFailure(call: Call, e: IOException) {
                               println("EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE")
                           }
                       })
                   }
                   job.start()
                   job.join()  // This should force my thread to finish before the rest of the code is executed on the main thread.
               }



           // println(collectionJsonObject.collects[0].product_id)

            /*runOnUiThread {
                recyclerViewCustomCollections.adapter = CollectionsAdapter(jsonObject)
            }*/

        }
        override fun onFailure(call: Call, e: IOException) {
            println("EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE")
        }
    })
}

1 Ответ

0 голосов
/ 13 января 2019

В этом случае вы должны использовать команду execute, как упомянуто, и поскольку вызовы http обрабатываются асинхронно, ваш поток является избыточным и должен быть удален.

Если вы хотите запустить код после того, как все запросы завершены, один из способов сделать это - передать функцию обратного вызова onComplete и подсчитать количество выполненных запросов, когда все потоки завершены, вызвать функцию обратного вызова, содержащую код это должно быть выполнено после всех запросов.

...