Size: a a a

Android Developers

2021 November 13

DT

Dmitry Tsyvtsyn in Android Developers
Можно подробнее, покажите код
источник

MV

Max V in Android Developers
так я указал ссылку. за простыню сюда не забанят?)
источник

L

Leonid in Android Developers
В onCreateView следует ТОЛЬКО создать и вернуть вью. А у вас там запросы создаются.

Бизнес-логику следует вынести в view model и обращаться к ней из UI или подписываться на LiveData.

Запрос вообще-то асинхронный. Вы же ему сами листенер onResponse прописали.

Кстати, как вот это, объявленное ВНУТРИ листенера, возвращается из jsonParseFromServer?
public JSONObject employee

Ааа.. Разглядел, оно у вас в двух местах объявлено! В общем, вы возвращаете null, а запрос где-то там исполняется в это время. Всё происходит ровно так, как вы попросили :)
источник

MV

Max V in Android Developers
как же много я еще не знаю)))
не пойму почему запрос не должен быть в onCreateView фрагмента.
задача: по клику на кнопку в mainactivy происходит обработка какая кнопка была нажата, и во фрагмент загружается нужное отображение, в частности rv с данными из json.
поэтому и думал что запрос нужно делать именно onCreateView чтобы данные получить, подготовить, и отобразить.

public JSONObject employee; внутри Response.Listener<JSONObject> я так понимаю лишний?


Log.d("json_answer", "onCreateView: "+jsonRow); - так в лог данные прилетают
Log.d("json_answer", "onCreateView: "+jsonRow.toString()); - а так падает
не улавливаю что не так сделано(
источник

L

Leonid in Android Developers
Потому что задача onCreateView - создать и вернуть вью.
Настраивать вью и начинать работу с  UI можно в onViewCreated.

Но никто не запрещает писать что попало где попало и как попало :)

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

Запросы могут быть асинхронными, когда функция тут же возвращает управление и продолжает работу у себя внутри, а результат возвращает  через листенер тогда, когда результат будет готов.

Второе - ваш случай. Но вы запускаете запрос и тут же выходите из функции, не дожидаясь никакого результата.
источник

TA

The Real Abduro John in Android Developers
А инициализировать вьюМодел тогда в onCreate?
источник

TA

The Real Abduro John in Android Developers
И там же осуществить запрос?
источник

L

Leonid in Android Developers
https://developer.android.com/topic/libraries/architecture/viewmodel

У viewmodel должна быть LiveData, куда будет присвоен результат запроса. Фрагмент подпишется на эту LiveData.

У viewmodel может быть метод, который вы вызовете из фрагмента. Метод сделает запрос и обновит LiveData, а фрагмент получит значение этой LiveData.

Никаких извращений, все довольны :)
источник

TA

The Real Abduro John in Android Developers
Спасибо, правда я использую flow, а запросы меняю через мапы
источник

L

Leonid in Android Developers
Дело ваше 🤷
Гугл рекомендует переходить с LiveData на Flow.
источник

TA

The Real Abduro John in Android Developers
Ну, я так и поступил)
источник

L

Leonid in Android Developers
Ну и правильно 👍
источник

TA

The Real Abduro John in Android Developers
Не подскажете, почему при использовании пейджинга в связке с Room при изменении сортировки результатов запроса (например с убывающего на возрастающий) recyclerview теряет позицию, а точнее отбрасывает на определенный по номеру элемент, позиция которого совпадает с размером initLoadSize пейджера
источник

L

Leonid in Android Developers
Не знаю. Я это не использую - нет таких задач.
источник

TA

The Real Abduro John in Android Developers
Хорошо, спасибо
источник

MV

Max V in Android Developers
да, такой вариант я собственно и хотел, только не знал как оно называется) onViewCreated как не знал, даже в доке оно упоминается в жизненном цикле не как основное, поэтому и пропустил. Спасибо)
источник

АМ

Артем Миницкий... in Android Developers
Привет, подскажите пожалуйста, а можно ли сделать так чтобы рекламный баннер загружался на одном экране а показывался на втором сразу после загрузки экрана, а не загружался полностью на втором экране, с полно экранной все проще там есть четкое разделение методов на загрузку и показ, а у баннера он общий же?
источник

АГ

Антон Гуляев... in Android Developers
Ты какой именно хочешь показать баннер?)
Там он сначала загружается, затем ты его пихаешь в условный provider, переходишь на нужный тебе экран и там показываешь его
Код можно посмотреть в гугле, я для рекламы его полностью взял, он решил мои проблемы
источник

АМ

Артем Миницкий... in Android Developers
Large banner, у него ведь только метод loadAd, который сразу и грузит и показывает или я что-то упустил?
источник

АГ

Антон Гуляев... in Android Developers
Там же в том функции, которая грузит и показывает есть локальная переменная, куда загружается реклама. После того, как она загрузилась, она показывается. Но ничего не мешает тебе показать это на другом экране.
источник