Намеренный зависимый от 2 вызовов API?
Предположим, у меня есть ситуация, когда ответ API заполняет мою модель Musician информацией, специфичной для этого музыканта. Есть еще один ответ API, который, учитывая имя музыканта, описывает связанных исполнителей.
Я хочу запустить детальное действие, показывающее имя музыканта, участников, жанр, альбомы (ответ API), а также связанных исполнителей (ответ API B).
Асинхронный сетевой вызов обеспечит лучшее взаимодействие с пользователем, но поскольку запуск операции детализации зависит от двух разных вызовов API, есть ли лучшее решение, чем асинхронный вызов API и синхронизация вызова API B (блокирование A и пользовательского интерфейса)?
Если я сделаю оба асинхронных, вызов API B может выполняться во время изменения активности, останавливая его (поскольку асинхронная задача уничтожается при изменении активности). Это приведет к отсутствию данных в подробном действии.
1 ответ
В простом случае:
- Начать детализацию
- Выполните оба запроса асинхронно, предоставляя пользователю загрузочный UX
- После получения обновите пользовательский интерфейс соответственно
- Вы можете изменить макет
Activity
в любое время во время выполнения без воссоздания. - Вы можете либо обновить пользовательский интерфейс немедленно с помощью "Response A", а затем снова с "Response B" или подождать, пока оба ответа вернутся, а затем обновить UI; первое предпочтительнее.
- Вы можете изменить макет
Сетевые операции никогда не должны блокировать пользовательский интерфейс или пользователя. Отображение загрузочных блесен и тому подобное вполне приемлемо и все время используется в собственных приложениях Google.