2016-08-22 3 views
1

Je développe une application Android, où initialement il télécharge toutes les ressources des applications sous forme de serveur et enregistre dans le dossier de données, où le téléchargement se produit en arrière-plan. Lorsque l'utilisateur navigue entre des fragments contenant gridview, les ressources téléchargées s'affichent dans l'élément de la grille (imageview) sinon il montre le cercle de chargement indiquant que les ressources sont en état de téléchargement.Android multi-threading télécharger n nombre de ressources en arrière-plan

Voici comment j'ai conçu le gestionnaire de téléchargement. Utilisation de ThreadPoolExecuter pour créer 4 threads et PriorityBlockingQueue avec la taille par défaut. Chaque thread a une file d'attente de taille 5. Ici, la fonction round robin vérifie chaque file d'attente de threads et ajoute une tâche au thread qui a l'espace libre dans la file d'attente.

Quelqu'un pourrait-il m'aider à atteindre les exigences ci-dessus en donnant des pointeurs, exemple de pseudo-code.

I mis en œuvre le scénario ci-dessus, mais je me bats sur la zone où « Chaque thread a une file d'attente de la taille 5. Fonction robin Ici ronde va vérifier chaque file d'attente de threads et ajoute tâche au fil possède un espace libre de file d'attente »

Je pensais depuis 2 jours comment implémenter le thread avec sa propre file d'attente qui doit être remplie par PriorityBlockingQueue par round robin.

+0

Je ne suis pas vraiment sûr pourquoi vous ce faire de cette façon. La limite de votre débit n'est pas le traitement (vous n'avez pas mentionné du tout le traitement du fichier) de sa bande passante. En téléchargeant plusieurs choses à la fois, vous répartissez votre bande passante entre plusieurs transferts. Je ne pense pas que ce serait plus rapide qu'un seul fil de télécharger une chose à la fois. –

+0

Les fichiers dans le sens seront principalement des images. Plus encore, j'ai besoin de télécharger des images en parallèle. – Kruise

+0

AGain, pourquoi? Votre facteur limitant sera la bande passante. Le téléchargement de plusieurs choses en parallèle n'aidera pas vraiment, à moins que l'un des serveurs ait une bande passante si faible qu'il ne sature pas votre pipe. Ce qui est peu probable, surtout sur mobile. –

Répondre

0

J'utilise avant trois mois cette bibliothèque est vraiment impressionnante bibliothèque comme ressource multiple téléchargement en parallèle comme WhatsApp

je l'ai fait la même chose mais avec des fichiers PDF un certain temps il y a. Vous devez d'abord choisir une bonne bibliothèque client Http pour effectuer les téléchargements et oublier tous les problèmes liés aux téléchargements que vous aurez si vous effectuez ces opérations par vous-même. Je recommande que vous utilisiez la bibliothèque Ion a beaucoup de fonctionnalités utiles comme annuler les téléchargements, attacher des rappels pour avoir un oeil dans la progression du téléchargement, savoir si le téléchargement a réussi, échoué, etc

Deuxièmement, vous avez évidemment besoin d'un service en arrière-plan, toujours, vous pouvez le faire en faisant votre propre service, et il est très important que le nom du processus de service dans le manifeste android est comme android: name = "com.company.app.services.MyService" et pas comme android : name = ": MyRemoteService" Ce faisant, vous vous assurez que le service fonctionnera en arrière-plan tout le temps (gardez à l'esprit que le système d'exploitation peut et va tuer le service s'il est nécessaire, mais le service sera redémarré les ressources seront à nouveau disponibles). Troisièmement, pour conserver toutes les vues, les vues personnalisées, les activités, les fragments, etc. qui affichent ces fichiers mis à jour, vous devez déclencher BroadcastReceivers à partir de votre Service. Gardez à l'esprit que vous ne pouvez pas utiliser LocalBroadcastReceiver, car votre service dispose de son propre processus indépendant de votre application.

enter image description here

1) Theres pas nécessaire d'utiliser explicitement une activité, vous pouvez enregistrer vos émissions partout où vous le voyez en forme. Un RecyclerAdapter (très probablement), un fragment ou une activité.

2) L'application/le service de communication est effectué par l'intermédiaire d'intentions, de sorte que toutes les données que vous envoyez vers et depuis le service doivent être sérialisables.

3) Vous pouvez utiliser différents types de diffusion chacun pour différentes situations (erreur, échec, succès, progression, etc.) ou vous pouvez utiliser un seul et envoyer une énumération qui décrivent ce type de statut à travers le paquet de l'intention lorsque vous tirez les émissions de votre service

J'espère que cela vous aide, si vous avez un doute, faites le moi savoir.

pour la bibliothèque Plus d'infos ION