CallBack после создания объекта, который содержит асинхронную функцию - PullRequest
0 голосов
/ 03 апреля 2019

Я получил класс Product, который построен с помощью кода.Этот код сделан для вызова API открытых фактов пищи для создания экземпляров всех переменных класса.Дело в том, что вызов API является асинхронной функцией.Так что в моем основном потоке, когда я пытаюсь получить доступ к параметрам моего объекта, он пуст.Поскольку я не могу прервать основной поток, как мне сделать обратный вызов для моего экземпляра объекта?

Вот код

Product.kt

class Product(code: Long) {

    val client = OkHttpClient()

    var name: String? = null
    var imageUrl: String? = null
    var packerCode: Int? = null
    var packerCity: String? = null
    var lat: Int? = null
    var long: Int? = null

    init {
        run("https://fr.openfoodfacts.org/api/v0/produit/$code.json")
    }

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

        client.newCall(request).enqueue(object : Callback {
            override fun onFailure(call: Call?, e: IOException) {}
            override fun onResponse(call: Call?, response: Response){
                val jsonData = response.body()?.string()
                val Jobject = JSONObject(jsonData)

                name = Jobject.getJSONObject("product").getString("product_name")
            }
        })
    }
}

GameActivity.kt

class GameActivity : AppCompatActivity(){
   override fun onCreate(savedInstanceState: Bundle?) {
   super.onCreate(savedInstanceState)
   setContentView(R.layout.activity_game)

   val textView: TextView = findViewById(R.id.productName) as TextView
   val product = Product(3564700014677)
   // Product.name empty
   textView.text = product.name
}

1 Ответ

2 голосов
/ 03 апреля 2019

Прежде всего, мы предполагаем, что вы не хотите использовать архитектуру MVVM или около того. Но я действительно рекомендую вам прочитать о компонентах архитектуры Android, таких как ViewModel и LiveData, чтобы понять, как должен выполняться поток данных в приложениях для Android.

Переходя к основам (не очень понятный способ), мы должны создать интерфейс и передать ссылку на класс Product, и в случае успеха вы должны использовать ссылку для вызова операции для обновления текстового представления.

Шаг 1: создать интерфейс

interface ProductListener
{
    fun onSuccess()
}

Шаг 2. Внедрите ProductListener в свою деятельность

class GameActivity : AppCompatActivity(),ProductListener {

 ...
 ...
 ...

 override fun onSuccess() {

    }
}

Шаг 3: передать ссылку на слушателя / активность в класс Product

val product = Product(3564700014677, this) //inside your activity

class Product(code: Long, var listener: ProductListener) {

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

        client.newCall(request).enqueue(object : Callback {
            override fun onFailure(call: Call?, e: IOException) {}
            override fun onResponse(call: Call?, response: Response){
                val jsonData = response.body()?.string()
                val Jobject = JSONObject(jsonData)

                name = Jobject.getJSONObject("product").getString("product_name")

                // invoke listener here to let activity know the response

                 listener.onSuccess()
            }
        })
    }

}

Шаг 4. Обновление textview внутри реализации действия onSuccess ()

class GameActivity : AppCompatActivity(),ProductListener {

     ...
     ...
     ...

     override fun onSuccess() {
            textView.text = product.name
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...