Доступ к переменным класса из сопрограммы Kotlin - PullRequest
0 голосов
/ 05 декабря 2018

Я столкнулся со странной проблемой (новичок в Kotlin и сопрограммах).Я изменяю переменную класса в функции getMovies.В блоке запуска я получаю JSON, который затем запускаю через GSON и получаю изменяемый список записей информации о фильме.Вы можете увидеть 2 longToasts от Anko, которые отображают тост, но первый показывает 20, а другой 0. Почему это?Android Studio не выдает никаких ошибок, и я ссылаюсь на ту же переменную moviesList.Я пробовал многочисленные блоги и инструкции в Интернете, но не смог найти ничего полезного.Любая помощь будет очень признательна!

class MainActivity : Activity() {

private var moviesList: MutableList<Movie> = mutableListOf()

fun getMovies() {
        launch(UI){
            val result = async(CommonPool){
                getResponseJSON()
            }.await()
            moviesList = Gson().fromJson(result, MovieDBResponse::class.java).results
            longToast(moviesList.size.toString())
        }
        longToast(moviesList.size.toString())
    }
}

1 Ответ

0 голосов
/ 05 декабря 2018

Ваш код написан на основе экспериментального сопрограммного API, поэтому позвольте мне сначала обновить его до Kotlin 1.3 и исправить некоторые очевидные ошибки:

class MainActivity : Activity(), CoroutineScope {
    override val coroutineContext = Dispatchers.Main + SupervisorJob()

    private val moviesList: MutableList<Movie> = mutableListOf()

    fun getMovies() {
        launch {
            val result = withContext(Dispatchers.IO) { getResponseJSON() }
            moviesList += Gson().fromJson(result, MovieDBResponse::class.java).results
            longToast("Size after fetching: ${moviesList.size}")
        }
        longToast("Immediate size: ${moviesList.size}")
    }

    override fun onDestroy() {
        super.onDestroy()
        coroutineContext[Job]!!.cancel()
    }
}

Теперь, глядя на ваш код, это то, что яожидайте, что это сделает:

  1. launch параллельная сопрограмма, которая в конечном итоге извлечет некоторые данные JSON из сети
  2. Запрос на отображение тоста "Немедленный размер"
  3. Получены результаты JSON
  4. Заполните список фильмов
  5. Запрос на отображение тоста "Размер после извлечения"

Точная информация о том, когда вы видите тост наЭкран может отличаться в зависимости от политики Android и скорости загрузки.

...