AsyncTask 的新实例未执行

New instances of AsyncTask not executing

我从各种论坛示例中拼凑出来的这个 Kotlin 例程有效但仅在第一次调用时有效。

class myClass: Activity(), myInterface {


    override fun onCreate(...) {
        ...
    }    

    override fun myCallback(response: String) {
        myReturningFunction(response)
    }

    fun myCallingFunction() {        
        ...
        ...        
        val myServer = myObject 
        myServer.myObjectInit(this, stringData)
        //myServer.execute(stringData)
    }

}

interface myInterface {
    fun myCallback(response: String)
}

object myObject : AsyncTask<String, String, String>() {

    var thisInterface: myInterface? = null

    fun myObjectInit(thatInterface: myInterface, stringData: String) {
        thisInterface = thatInterface
        //this.executeOnExecutor(THREAD_POOL_EXECUTOR)
        this.execute(stringData)        
    }

    override fun doInBackground(vararg params: String): String? {

        var response: String = ""

        //return try {
        try {
            params.first().let {
                val url = URL("- web service URL -")
                val urlConnect = url.openConnection() as HttpURLConnection
                with(urlConnect) {
                    requestMethod = "POST"
                    readTimeout = 5000
                    connectTimeout = 5000
                    doInput = true
                    doOutput = true
                    setRequestProperty("Content-Type", "application/json")
                    setRequestProperty("Accept", "application/json")
                    setRequestProperty("Charset", "utf-8")

                    val jsonByteData = it.toByteArray(Charsets.UTF_8)
                    outputStream.write(jsonByteData, 0, jsonByteData.size)
                    outputStream.flush()
                    outputStream.close()

                    //inputStream.bufferedReader().readText()                    
                    response = inputStream.bufferedReader().readText()
                    inputStream.close()
                    disconnect()
                }
            }
        } catch (e: Exception) {
            response = ""
        }

        return response
    }

    override fun onPostExecute(result: String?) {
        when {
            result != null -> {
                thisInterface?.myCallback(result)
            }
            else -> {
                println("null response")
            }
        }
    }
}

我实例化一个AsyncTask对象的副本并执行它,当我通过接口成功接收到响应时,我实例化另一个副本(val myServer = myObject)用于后续调用,但是这次它引发此错误:

Cannot execute task: the task is already running.

我尝试了很多方法,关闭输入流,断开与服务器的连接,取消任务,但 none 行得通。

我遗漏的代码是否有明显错误?

TIA。

一个AsyncTask只能执行一次。如果你想再次执行它,你需要创建第二个。

来自文档:

The task can be executed only once (an exception will be thrown if a second execution is attempted.)

您可以做的是将 AsnycTask 子类化,并在每次要执行它时使用一个新实例:

fun startBackgroundTask(){
    CustomAsyncTask().execute()
    // Or in your case:
    CustomAsyncTask().myObjectInit(this, "data")
}

class CustomAsyncTask: AsyncTask<String, String, String>(){

    var thisInterface: myInterface? = null

    fun myObjectInit(thatInterface: myInterface, stringData: String) {
        thisInterface = thatInterface
        execute(stringData)
    }

    override fun doInBackground(vararg params: String?): String {
        // Do your work.
        return ""
    }
}