0

Je travaille sur une application basée sur la session en utilisant Kaltura APR.Quelle est la meilleure approche pour gérer des appels réseau simultanés (client http) pour charger des données à fragments multiples (faiblement couplés) à l'intérieur d'une seule activité?

Le design est tel que j'ai un pager view + tablayout dans chaque page j'ai un fragment et tout fragment est lié à une seule activité. En mode splash, je me connecte à Api et crée une session maintenant j'ai plusieurs appels réseau (et tout doit être fait dans une tâche asynchrone).

Énoncé du problème:

Disons que j'ai C1, C2, C3, C4, C5, fragments C6 et

chaque C a son propre ensemble de données (appel via n/w, AsyncTask) chargement le bloc de données bloque le thread principal et si l'utilisateur balaie vers une autre page, une nouvelle asynctask est exécutée alors que le thread de fond précédent est toujours en train de charger ce qui provoque des retards et ANR.

Suggestion:

Quelle est la meilleure approche pour gérer l'appel du réseau de chaque fragment: dois-je créer le thread Pooler pour ces tâches async autour de 8-10 et commencer à Pooler de fil dans les éclaboussures.

Je suis très vif sur la fuite de mémoire de l'activité et que vous souhaitez obtenir un chargement rapide des viewpager (les vues du fragment) i lu beaucoup de SO questions et @commonsWare Blog et aussi

this discussion on thread pooler mais veulent mieux connaître l'approche/l'architecture de faire ci-dessus question posée.

Répondre

0

Essayez RxJava. C'est une meilleure approche que la tâche asynchrone car la tâche asynchrone ne fait pas plusieurs appels réseau à la fois. RxJava est une bonne bibliothèque (mais difficile à apprendre) qui peut être utilisée pour faciliter le multithreading.

Vous pouvez utiliser Retrofit avec, donc ce n'est pas un problème.

Avec l'API kaltura, vous devrez jouer.

Pour effectuer plusieurs appels à la fois, vous pouvez utiliser la fonction merge avec plusieurs appels, de sorte que tous les appels seront appelés en même temps.

Vous pouvez également appeler chaque Observable lors de la création d'un nouveau fragment, si cela est fait correctement RxJava s'occupera de l'enfilage, donc "ancien" Observable ne s'arrêtera pas et le nouveau chargera toujours de nouvelles données.

La fonction zip peut également être utile, car elle peut charger quelques sources dans "un" objet.

Aussi il y a lien vers mon projet github (désolé pas la lisibilité de celui-ci):

https://github.com/JanuszHain/SocialMediaWatcher

fichiers qui pourraient vous intéresser (chargement de données à l'aide RxJava avec l'API qui ne supporte pas RxJava dans un chemin droit):

Utilisation de la bibliothèque API (Twitter) pour obtenir des données avec rappel, puis la création observable hors de lui (par exemple la fonction 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

Abonnement à créé Observable (fonction observableGetNewTweets()). Notez que je créé de nouvelles Observable sur Observable dans cette fonction, il peut être un peu compliqué: https://github.com/JanuszHain/SocialMediaWatcher/blob/master/app/src/main/java/pl/janusz/hain/socialmediawatcher/TwitterTimeline.java

Création ArrayList de Observables puis de les fusionner (la création de plusieurs appels à la fois): https://github.com/JanuszHain/SocialMediaWatcher/blob/master/app/src/main/java/pl/janusz/hain/socialmediawatcher/TwitterWall.java

Et voici mon Scheduler. C'est pour la config observable, en limitant la quantité de threads pour optimiser de grandes quantités de nouvelles demandes de threads: https://github.com/JanuszHain/SocialMediaWatcher/blob/master/app/src/main/java/pl/janusz/hain/socialmediawatcher/util/MyScheduler.java