【问题标题】:Optimal solution for utilizing the same AsyncTask repeatedly?重复使用同一个 AsyncTask 的最佳解决方案?
【发布时间】:2020-01-11 20:02:48
【问题描述】:

我知道 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 的变量?这是一个包含 processFinish 抽象方法的接口,它接受一个字符串并且什么都不返回。

我的问题是,我怎样才能重复运行 AsyncTask 同时仍然得到响应?提前致谢。

【问题讨论】:

  • 由于 AsyncTask 可能会在大约 2 个月内被弃用,我建议您迁移到其他东西(可能是协程,因为您使用的是 Kotlin)。
  • 你能推荐一些关于如何迁移到协程的资源吗?
  • 我不知道有什么特别适合从AsyncTask 迁移到协程的事情,尽管我刚刚将其添加到我要写的博客文章主题列表中...... :-) 我在this book 中介绍了协程,并在this book 中有几个使用它们的示例。例如,this sample appthis sample app 各自使用协程实现“diceware”应用程序。
  • 感谢CommonsWare!使用 Coroutines 很容易设置,一开始我很害怕,但现在代码缩短了 60 行。谢谢!

标签: android kotlin android-asynctask


【解决方案1】:

最后,我决定使用协程。协程易于使用,比 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)
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    相关资源
    最近更新 更多