Как отменить старый AsyncTask для нового - PullRequest
0 голосов
/ 30 марта 2019

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

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

var getBoundedMomentsTask : BoundsRequestTask = BoundsRequestTask()

//Starts an asynchronous task
//Called by ViewModel
//A list of moments is returned to the live data object
fun queryMapMoments(bounds : LatLngBounds, zoom : Float ) {

    //If the request is already running, end it
    if (getBoundedMomentsTask.status == AsyncTask.Status.RUNNING) {
        getBoundedMomentsTask.cancel(true)
    }

    //The while loop just hung up the system.
    //while (getBoundedMomentsTask.status == AsyncTask.Status.RUNNING) {
    //    getBoundedMomentsTask.cancel(true)
    //}

    //Begin the new task
    getBoundedMomentsTask.execute(BoundsTaskParams(bounds, zoom))

}


inner class BoundsRequestTask : AsyncTask<BoundsTaskParams, Void, List<Moment>>() {

    override fun doInBackground(vararg params: BoundsTaskParams?): List<Moment> {

        val bounds: LatLngBounds? = params[0]?.bounds
        val zoom: Float? = params[0]?.zoom

        if (!isCancelled) {

            Log.d("doInBackground", "Getting map channel")
            val channel = checkMapChannels(bounds, zoom)

            if (!isCancelled) {

                Log.d("doInBackground", "Asking for moments from database")
                channel.fetchDatabaseMoments()
            } else {
                return mutableListOf()
            }

            if (!channel.networkRequested) {

                if (!isCancelled) {

                    Log.d("doInBackground", "Asking for moments from network")
                    channel.fetchMomentsOnNetwork()
                } else {
                    return mutableListOf()
                }
            }

            //Save the channel and return the moments

            Log.d("doInBackground", "Saving the returned channel")
            channels.add(channel)
            return channel.regionMoments

        } else {
            return mutableListOf()
        }

    }

    override fun onPostExecute(list : List<Moment>) {
        mappedMoments.value = list

    }
}

Я получаю ошибку Cannot execute task: the task has already been executed (a task can be executed only once) на линии с getBoundedMomentsTask.execute(BoundsTaskParams(bounds, zoom))

1 Ответ

1 голос
/ 30 марта 2019

Вы должны создать новый экземпляр AsyncTask. Один экземпляр может быть выполнен только один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...