Читаем данные из интернет

Для чтения данных из интернет есть множество библиотек и классов, потому не стоит делать так, как это описано ниже в статье. Я буду использовать базовые библиотеки, и будет много кода (kotlin).

Задача — есть BASE_URL, надо прочитать текстовые данные. Вы можете написать вот такой код функции, как часть вашего активити:

Разберем основные моменты.

Сперва нужно убедиться, что у вашего приложения есть необходимые разрешения. Мы читаем данные из сети Интернет. В корень манифеста добавьте строки с разрешениями:

Загрузку данных приходится производить в другом потоке, потому используется класс Thread с неявной реализацией Runnable интерфейса. Обычно так не делают, так как с реализацией на Thread много возни, чтобы реализовать всё действительно правильно.

Матрешка из объявлений потоков сделана для оптимизации чтения данных — inputStream — читает данные по байтам, а нам нужен текст (символы), затем мы обертываем это в буферизированный ввод, чтобы читать не символами, я сразу кусками по 8кб:

В итоге данные выводятся в лог в другом потоке выполнения кода. А хотелось бы подписаться на источник данных, и что то сделать с ними, когда данные будут готовы, например вывести их уже в основном потоке. И лучше придерживаться шаблона MVVM, т.е. данная функция не должна быть в Activity, а находиться в классе поставщике данных (модели).

MVVM подход

Так наш код распадается на три класса — MainActivity — это класс с активити нашего приложения, MainActivityViewModel — бизнес логика и поставщик LiveData объектов, на которые может подписываться активити. И вся грязная работа падает в модель — класс GetFromInternet, которая поставляет данные из интернета.

Начнем с активити (VIEW составляющая)

Мы создаём экземпляр MainActivityViewModel, от которого требуется поставить нам LiveData объект. Мы на него подписываемся, используя метод observe. И когда данные получены, выводим их в консоль.

Таким образом мы ничего здесь не знаем ни о Модели, ни о бизнес логике.

ViewModel компонент

Этот класс очень простой, т.к. никакой бизнес-логики в нашем приложении нет, реализует только один метод — getData, который вернет LiveData<String> объект.

Данные мы получаем из источника GetFromInternet, это наша модель данных.

Источник данных, Модель

Для синхронного получения данных я воспользуюсь сервисом Executors.newSingleThreadExecutor(), который создаёт пул потоков из одного потока. При этом я могу передавать задачи в этот пул и ожидать результат.

Чтобы задача вернула результат, приходится реализовывать Callable интерфейс, куда мы вставим уже знакомый код.

Метод submit вернет объект типа Future, а его синхронный метод get дождется результаты работы, и его можно будет вернуть уже как результат работы источника данных.


Запрос данных выполняется в дополнительном потоке, потому мы не блокируем основной поток приложения. Когда данные будут считаны, они будут переданы в LiveData и наш наблюдатель инициирует функцию заданную в observe — вывод строки в консоль.

Написать комментарий

Мало букафф? Читайте есчо !

Анимированный градиент в ActionBar

Октябрь 23, 2022 г.

Расскажу как создать фон для actionbar с анимацией градиента цвета. Нам понадобится Android Studio и Kotlin. Для начала добавим drawable ресурс в наш проект. Откроем в проекте вкладку res/drawable и выберем из меню File -> New -> Drawable ...

Читать

Вызов одного конструктора в другом в Kotlin

Январь 21, 2025 г.

Если вы переходите с java на kotlin, то у вас часто возникают вопросы вроде - как сделать на kotlin то, что вы делали на java вот так и так. В java вызов перегруженного конструктора в другом конструкторе класса выглядит следующим образом. Представим, ...

Читать

 

Комментарии к «Читаем данные из интернет»

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий: