AsyncTask использовать в Kotlin - PullRequest
0 голосов
/ 02 мая 2018

У меня проблема с AsyncTask в Kotlin, я на самом деле новичок, поэтому, пожалуйста, будьте клевыми:)

Так что проблема здесь в том, что я хотел бы использовать значение результата, которое находится в onPostExecute (), в другом классе

Позвольте мне показать вам мой код. Вот класс ProviderAsync () в моем файле Provider.kt (я просто создаю массив Hashmap, который я хочу использовать):

class ProviderAsync() : AsyncTask<HashMap<String, Any>, Void, ArrayList<HashMap<String, Any>>>() {

var allThings: ArrayList<HashMap<String, Any>> = arrayListOf()
override fun doInBackground(vararg params: HashMap<String, Any>): ArrayList<HashMap<String, Any>>? {
    for (i in 0..2000) {
        val thing = hashMapOf("Loc" to "fr", "name" to "class", "Id" to "23", "tuto" to "fr", "price" to 44)
        allThings.add(thing )
    }
    return null
}

override fun onPreExecute() {
    super.onPreExecute()
    // ...
}

override fun onPostExecute(result: ArrayList<HashMap<String, Any>>?) {
    super.onPostExecute(result)
    // what can I do Here
}

А теперь вот мой метод getThings () в другом файле, где я хочу использовать значение результата, чтобы получить все элементы моего Arraylist:

fun getThings(context: Context) {
        ProviderAsync().execute()
        var values = // Here i want the RESULT send from my AsyncTask
         for (i in 0..values.size) {

                        var myObject = convertToMyObject(values[i])
                        allTickets.add(myObject)
                    }
        }

Спасибо и извините за мой английский

1 Ответ

0 голосов
/ 02 мая 2018

Вы можете воспользоваться функциональностью Котлина:

class ProviderAsync(private val callback: (things: ArrayList<HashMap<String, Any>>) -> Unit) : AsyncTask<HashMap<String, Any>, Void, ArrayList<HashMap<String, Any>>>() {

    var allThings: ArrayList<HashMap<String, Any>> = arrayListOf()
    override fun doInBackground(vararg params: HashMap<String, Any>): ArrayList<HashMap<String, Any>>? {
        for (i in 0..2000) {
            val thing = hashMapOf("Loc" to "fr", "name" to "class", "Id" to "23", "tuto" to "fr", "price" to 44)
            allThings.add(thing)
        }
        return null
    }

    override fun onPreExecute() {
        super.onPreExecute()
        // ...
    }

    override fun onPostExecute(result: ArrayList<HashMap<String, Any>>) {
        super.onPostExecute(result)

        //callback function to be executed after getting the result
        callback(result)
    }
}

затем разделите логику обратного вызова в отдельную функцию, чтобы передать ее конструктору ProviderAsync:

fun getThings(context: Context) {
        ProviderAsync(::asyncTaskCallback).execute()
}

fun asyncTaskCallback(values: ArrayList<HashMap<String, Any>>) {
    for (i in 0..values.size) {

        var myObject = convertToMyObject(values[i])
        allTickets.add(myObject)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...