0

Я работаю над сессионным приложением, используя kaltura resftful APis.Что лучше всего подходит для управления параллельными сетевыми вызовами (http-клиент) для загрузки нескольких фрагментов (слабо связанных) данных внутри одной активности?

Дизайн такой, что у меня есть пейджер представления + tablayout на каждой странице. У меня есть фрагмент, и весь фрагмент связан с одной активностью.

В splash я подключаюсь к Api и создаю sesssion теперь у меня есть несколько сетевых вызовов (и все должно быть выполнено в async-задаче).

Постановка задачи:

Допустим, у меня есть C1, C2, C3, C4, C5, C6 фрагменты и

каждый С имеет свой собственный набор данных (Через п/ш вызова, AsyncTask) загрузка блок данных блокирует основной поток, и если пользователь перебирает другую страницу, выполняется новая асинтеза, а предыдущий фоновый поток все еще загружается, что вызывает задержки и ANR.

Предложение:

Что лучший подход для управления сетевого вызова каждого фрагмента: я должен создать нить Pooler для этих задач асинхронных около 8-10 и начать нить Pooler в всплеске.

Я очень увлечен утечка памяти активности и хочу добиться быстрой загрузки ViewPager (просмотры фрагмента) я прочитал много SO вопросов и @commonsWare Blog, а также

this discussion on thread pooler но хочу знать лучше подход/архитектуру делает выше указанный вопрос.

ответ

0

Попробуйте RxJava. Это лучший подход, чем задача Async, поскольку задача Async не выполняет сразу нескольких сетевых вызовов. RxJava - это хорошая (но трудно обучаемая) библиотека, которая может использоваться для упрощения многопоточности.

Модифицировать это изделие можно, так что это не проблема.

С API kaltura вам придется поиграть.

Для совершения нескольких вызовов сразу вы можете использовать функцию merge с несколькими вызовами, поэтому все вызовы будут вызываться сразу.

Вы также можете позвонить каждому Observable при создании нового фрагмента, если все сделано правильно. RxJava позаботится о потоковом, поэтому «старый» Observable не остановится, а новый будет по-прежнему загружать новые данные.

Также функция zip может быть удобной, так как она может загружать несколько источников в «один» объект.

Также есть ссылка на мой GitHub проекта (жаль не читаемости его):

https://github.com/JanuszHain/SocialMediaWatcher

Файлы, которые могут вас заинтересовать (загрузка данных с использованием RxJava с API, который не поддерживает RxJava в прямой путь):

Использование библиотеки API (Twitter), чтобы получить данные с помощью обратного вызова, а затем создать Наблюдаемые из него (например, функции private Observable<ArrayList<Tweet>> createObservableReadTweets(final String screen_name, final int count)): https://github.com/JanuszHain/SocialMediaWatcher/blob/master/app/src/main/java/pl/janusz/hain/socialmediawatcher/TwitterTimelineGetter.java

Подписываемся к созданным Observable (function observableGetNewTweets()). Обратите внимание, что я создал новый Observable из Observable в этой функции, поэтому она может быть немного сложнее: https://github.com/JanuszHain/SocialMediaWatcher/blob/master/app/src/main/java/pl/janusz/hain/socialmediawatcher/TwitterTimeline.java

Создание ArrayList из Observables, а затем объединять их (создание нескольких вызовов одновременно): https://github.com/JanuszHain/SocialMediaWatcher/blob/master/app/src/main/java/pl/janusz/hain/socialmediawatcher/TwitterWall.java

И вот мой Планировщик. Это для Observable config, ограничение количества потоков для оптимизации большого количества новых запросов нитей: https://github.com/JanuszHain/SocialMediaWatcher/blob/master/app/src/main/java/pl/janusz/hain/socialmediawatcher/util/MyScheduler.java