Новые экземпляры AsyncTask не выполняются - PullRequest
0 голосов
/ 05 ноября 2019

Эта подпрограмма 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.

Я перепробовал много подходов,закрытие потока ввода, отключение от сервера, отмена задачи, но ничего из этого не работает.

Что-то явно не так с кодом, который я пропускаю?

TIA.

1 Ответ

3 голосов
/ 05 ноября 2019

AsyncTask может быть выполнен только один раз. Если вы хотите выполнить его снова, вам нужно будет создать второй.

Из документации:

Задача может быть выполнена только один раз (будет сгенерировано исключение)если будет предпринято второе выполнение.)

Что вы можете сделать, это создать подкласс 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 ""
    }
}
...