Как обеспечить корректную работу с сетью в Android приложении?
Пока что есть приложение с 2 экранами - 1)Вход с кнопками(одна из которых переход во второй экран) 2)Простейшая активити с TextView и ImageView. На данный момент я делаю запрос через Retrofit в onCreate 2-й активности и по окончании запроса у меня информация полученная передаётся в TextView и ImageView данной активности. Как сделать так, что бы не было задержек при добавлении картинки и текста во вторую активность? Сейчас,при открытии активности сначала я вижу пустой экран и только через секунду появляется изображение+текст. Мой код:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_nasa)
(application as MyApplication).getComponent().inject(this)
CoroutineScope(Dispatchers.IO).launch {
nasaActivityPresenter.goRetrofit(network)
}
}
override fun addInView(item: NasaPOJO) {
Picasso.get().load(item.urlImage).into(photoNasa)
description.text=item.description
}
И сама функция goRetrofit
fun goRetrofit(network: NetworkModule) {
val service = network.getRetrofit(NasaActivity.BaseURL).create(
NasaService::class.java)
val call = service.getNasaInfo("2018-11-17",false,
NasaActivity.ApiKey
)
call.enqueue(object : Callback<NasaInfo> {
override fun onResponse(call: Call<NasaInfo>, response: Response<NasaInfo>) {
val Nasa: NasaInfo? = response.body()
if (Nasa != null) {
viewState.addInView(NasaPOJO(Nasa.title,Nasa.url))
}
}
override fun onFailure(call: Call<NasaInfo>, t: Throwable) {
//
}
})
}
Я понимаю,что смысла в корутине,которая у меня сейчас мало(пока что тестирую) возможные варианты решения проблемы - 1) кешировать запросы на сервер в sp или ROOM(первый запрос тогда всё равно будет с тормозами) , 2)Делать запрос по нажатию кнопки в 1 активности или вообще по её открытию и потом передавать всё готовое во вторую активность. Заранее спасибо!(используется Moxy)
Ответы (1 шт):
Ну поскольку ваш запрос выполняется какое-то время вы никак не сможете отобразить ваш интерфейс до загрузки.
Есть 2 варианта:
Повесьте какой-то лоадер, в простейшем случае крутилку, если хотите прям заморочиться и сделать интерфейс User-Frendly посмотрите в сторону паттерна Skeleton.
Это грузить данные заранее, сохранять их в кэш и потом дергать оттуда. Но тут есть парочку нюансов:
Если на момент нажатия на кнопку открытия нового экрана у вас нет данных, то это вряд-ли вам подойдет. Например если вы получаете какую-то информацию от пользователя и в зависимости от этой информации грузите нужный контент, вам придется все же идти к варианту "1".
Если загрузить все данные при загрузке вашего приложение, может случиться так, что данные будут загружены, но пользователь ни разу ими не воспользуется (не придет на этот экран к примеру) и получится, что вы потратили трафик пользователя и память телефона в пустую.
Поэтому ваша задача эти моменты учесть и спланировать загрузку именно в тот момент когда пользователь потенциально должен воспользоваться ими. Если к примеру у вас есть флоу когда пользователь заходит в банковское приложение, и в нем есть экран заказа справок. Для этого ему нужно сделать такой флоу:
меню -> еще -> инфо -> заказать справки.Загружать их с приложением не стоит, но если к примеру пользователь провалился уже до вкладки "Инфо", то возможно тут и стоит начать их грузить.
Ну и еще хорошим тоном, но более сложной реализацией считается показ данных по мере их подгрузки. Условно если у вас есть тоже банковское приложение и в экране с картой есть данные карты и список совершенных операций по ней и они дергаются двумя разными запросами, то не стоит ждать обоих, а показывайте по мере получения, например сперва карты если они первее прогрузились, после чего список операций. Можно и очередность запросов строить так, чтоб данные не грузились всем скопом, вдруг у пользователя интернет очень медленный, а так вы покажете ему хотя бы часть информации.