Оптимальное решение для повторного использования одного и того же AsyncTask? - PullRequest
0 голосов
/ 11 января 2020

Я знаю, что AsyncTask может быть запущен только один раз. Я знаю способ обойти это, но мне нужна переменная из AsyncTask, которая использует сложные (?) Процессы. Это мой код для вызова AsyncTask

val thr=NewTask()
    thr.delegate = this
    button.setOnClickListener {
        thr.execute()
    }

NewTask.doOnBackground () - это обычный метод, отправляющий запрос на URL. onPostExecute () немного отличается:

public override fun onPostExecute(result: String?) {
    //super.onPostExecute(result)
    delegate!!.processFinish(result!!)
}

с делегатом, являющимся переменной AsyncResponse? это интерфейс, содержащий абстрактный метод processFini sh, который принимает строку и ничего не возвращает.

Мой вопрос: как я могу запускать AsyncTask несколько раз, все еще получая ответ? Заранее спасибо.

1 Ответ

0 голосов
/ 12 января 2020

Наконец-то я решил использовать сопрограммы с этим. Сопрограммы просты в использовании, намного проще, чем AsyncTask. Я не знаю, почему я боялся их. Вот код, который я использовал:

class CoRoutine{
suspend fun httpGet(url: String = "https://boogle.org): String {
    val arr = ArrayList<String>()
    withContext(Dispatchers.IO) {
        val url = URL(url)

        with(url.openConnection() as HttpURLConnection) {
            requestMethod = "GET"  // optional default is GET

            //arr.add(responseCode)

            inputStream.bufferedReader().use {
                it.lines().forEach { line ->
                    //println(line)
                    arr.add(line as String)
                }
            }
        }
    }
    return arr.get(0)
}
}
...