Шаг 260.
Основы Kotlin.
Знакомство с сопрограммами. Парсинг характеристик персонажа

    На этом шаге мы рассмотрим, как можно распарсить полученные данные.

    Веб-служба, возвращающая характеристики персонажа, доступна по ссылке https://chargen-api.herokuapp.com.


Кстати, она написана на Kotlin с применением веб-фреймворка Ktor (https://github.com/ktorio/ktor.) Если вам интересно посмотреть на исходный код, это можно сделать по адресу https://github.com/bignerdranch/character-data-api.

    В ответ на запрос веб-служба возвращает список из характеристик персонажа, таких как race, name, dex, wis и str, разделенных запятыми, например такое: halfling,Lars Kizzy,14,13,8

    Ваше первое задание - преобразовать строку с характеристиками персонажа, возвращаемую веб-службой, в экземпляр CharacterData который можно отобразить в UI.

    Давайте начнем. Откройте CharacterGenerator.kt в AndroidStudio и объявите функцию преобразования fromApiData().

.   .   .   .
object CharacterGenerator {
    data class CharacterData(val name: String,
                             val race: String,
                             val dex: String,
                             val wis: String,
                             val str: String) : Serializable
    .   .   .   .
    fun fromApiData(apiData: String): CharacterData {
        val (race, name, dex, wis, str) =
            apiData.split(",")
        return CharacterData(name, race, dex, wis, str)
    }

}


Рис.1. Добавление функции fromApiData() (CharacterGenerator.kt)

    Функция fromApiData() принимает строку со значениями, полученную от веб-службы, разбивает ее по запятым и записывает результаты в новый экземпляр CharacterData.

    Проверьте fromApiData(), вызвав ее нажатием кнопки GENERATE. Для примера передадим фиктивные данные.

private const val CHARACTER_DATA_KEY = "CHARACTER_DATA_KEY"

class MainActivity : AppCompatActivity() {
    .   .   .   .
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // setContentView(R.layout.activity_main)

        val binding = ActivityMainBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)

        characterData = savedInstanceState?.characterData ?:
                CharacterGenerator.generate()

        binding.generateButton.setOnClickListener {
            characterData = CharacterGenerator.//generate()
                                fromApiData("halfling,Lars Kizzy,14,13,8")
            displayCharacterData(binding)
        }

        displayCharacterData(binding)

    }

    .   .   .   .
}
Файл с проектом можно взять здесь.


Рис.2. Тестирование функции fromApiData() (MainActivity.kt)

    Запустите Samodelkin в эмуляторе, чтобы убедиться, что все работает. Нажмите кнопку GENERATE. Вы увидите в UI тестовые данные, переданные в функцию преобразования (рисунок 3).


Рис.3. Отображение тестовых данных

    На следующем шаге мы рассмотрим извлечение оперативных данных.




Предыдущий шаг Содержание Следующий шаг