J'essaie d'écrire une application simple qui est mise à jour. Pour cela, j'ai besoin d'une fonction simple qui peut télécharger un fichier et afficher la progression actuelle dans un fichier ProgressDialog
. Je sais comment faire le ProgressDialog
, mais je ne sais pas comment afficher la progression actuelle et comment télécharger le fichier en premier lieu.
java
android
download
android-asynctask
Tom Leese
la source
la source
Réponses:
Il existe de nombreuses façons de télécharger des fichiers. Après, je publierai les moyens les plus courants; c'est à vous de décider quelle méthode est la meilleure pour votre application.
1. Utilisez
AsyncTask
et affichez la progression du téléchargement dans une boîte de dialogueCette méthode vous permettra d'exécuter certains processus d'arrière-plan et de mettre à jour l'interface utilisateur en même temps (dans ce cas, nous mettrons à jour une barre de progression).
Importations:
Ceci est un exemple de code:
Le
AsyncTask
ressemblera à ceci:La méthode ci-dessus (
doInBackground
) s'exécute toujours sur un thread d'arrière-plan. Vous ne devriez pas y faire de tâches d'interface utilisateur. D'autre part,onProgressUpdate
etonPreExecute
exécutez sur le thread d'interface utilisateur, vous pouvez donc y changer la barre de progression:Pour que cela fonctionne, vous avez besoin de l'autorisation WAKE_LOCK.
2. Téléchargement à partir du service
La grande question ici est: comment mettre à jour mon activité depuis un service? . Dans l'exemple suivant, nous allons utiliser deux classes que vous ne connaissez peut-être pas:
ResultReceiver
etIntentService
.ResultReceiver
est celui qui nous permettra de mettre à jour notre fil depuis un service;IntentService
est une sous-classeService
qui génère un thread pour effectuer un travail d'arrière-plan à partir de là (vous devez savoir qu'unService
s'exécute réellement dans le même thread de votre application; lorsque vous étendezService
, vous devez générer manuellement de nouveaux threads pour exécuter les opérations de blocage du processeur).Le service de téléchargement peut ressembler à ceci:
Ajoutez le service à votre manifeste:
Et l'activité ressemblera à ceci:
Voici est
ResultReceiver
venu jouer:2.1 Utiliser la bibliothèque Groundy
Groundy est une bibliothèque qui vous aide essentiellement à exécuter des morceaux de code dans un service d'arrière-plan, et elle est basée sur le
ResultReceiver
concept illustré ci-dessus. Cette bibliothèque est obsolète pour le moment. Voici à quoiressemblerait tout le code:L'activité où vous affichez la boîte de dialogue ...
Une
GroundyTask
implémentation utilisée par Groundy pour télécharger le fichier et montrer la progression:Et ajoutez simplement ceci au manifeste:
Ça ne pourrait pas être plus facile je pense. Prenez le dernier pot de Github et vous êtes prêt à partir. Gardez à l'esprit que le but principal de Groundy est d'appeler des API REST externes dans un service d'arrière-plan et de publier facilement les résultats dans l'interface utilisateur. Si vous faites quelque chose comme ça dans votre application, cela pourrait être vraiment utile.
2.2 Utilisez https://github.com/koush/ion
3. Utilisez la
DownloadManager
classe (GingerBread
et plus récente seulement)GingerBread a apporté une nouvelle fonctionnalité,
DownloadManager
qui vous permet de télécharger facilement des fichiers et de déléguer le dur travail de gestion des threads, des flux, etc. au système.Voyons d'abord une méthode utilitaire:
Le nom de la méthode explique tout cela. Une fois que vous êtes sûr qu'il
DownloadManager
est disponible, vous pouvez faire quelque chose comme ceci:La progression du téléchargement s'affichera dans la barre de notification.
Dernières pensées
Les première et deuxième méthodes ne sont que la pointe de l'iceberg. Il y a beaucoup de choses que vous devez garder à l'esprit si vous voulez que votre application soit robuste. Voici une brève liste:
INTERNET
etWRITE_EXTERNAL_STORAGE
); aussiACCESS_NETWORK_STATE
si vous voulez vérifier la disponibilité d'Internet.Sauf si vous avez besoin d'un contrôle détaillé du processus de téléchargement, envisagez d'utiliser
DownloadManager
(3) car il gère déjà la plupart des éléments répertoriés ci-dessus.Mais considérez également que vos besoins peuvent changer. Par exemple,
DownloadManager
ne met pas en cache la réponse . Il téléchargera aveuglément plusieurs fois le même gros fichier. Il n'y a pas de moyen facile de le réparer après coup. Où si vous commencez avec une baseHttpURLConnection
(1, 2), alors tout ce dont vous avez besoin est d'ajouter uneHttpResponseCache
. Ainsi, l'effort initial d'apprentissage des outils standard de base peut être un bon investissement.la source
close()
flux (input
etoutput
) dansfinally
au lieu detry
, sinon si une exception est levée avantclose()
, vous avez des flux non fermés qui traînent.sdcard/
utiliser à laEnvironment.getExternalStorageDirectory()
place.N'oubliez pas d'ajouter des autorisations à votre fichier manifeste si vous allez télécharger des trucs sur Internet!
la source
Oui , le code ci - dessus fonctionnera si vous .Mais mettez à jour votre
progressbar
dansonProgressUpdate
deAsynctask
et vous appuyez sur le bouton arrière ou terminer votre activitéAsyncTask
desserre sa piste avec votre interface utilisateur .Et quand vous revenez à votre activité, même si le téléchargement est en cours d' exécution en arrière - plan , vous verrez pas de mise à jour sur la barre de progression. Donc,OnResume()
essayez d'exécuter un thread commerunOnUIThread
avec une tâche de minuterie qui met à jour urprogressbar
avec des valeurs de mise à jour à partir de l'AsyncTask
arrière-plan en cours d'exécution.N'oubliez pas de détruire le fil lorsque votre activité n'est pas visible.
la source
Je vous recommande d'utiliser mon Project Netroid , il est basé sur Volley . Je lui ai ajouté des fonctionnalités telles que le rappel multi-événements, la gestion du téléchargement de fichiers. Cela pourrait être utile.
la source
SSLSocketFactory
ajout, ilHostnameVerifier
n'est pas possible et j'ai besoin d'un tel vérificateur. A soulevé un problème à ce sujet.J'ai modifié la
AsyncTask
classe pour gérer la création deprogressDialog
dans le même contexte. Je pense que le code suivant sera plus réutilisable. (il peut être appelé depuis n'importe quelle activité juste passer le contexte, le fichier cible, le message de dialogue)la source
N'oubliez pas de remplacer "/ sdcard ..." par un nouveau fichier ("/ mnt / sdcard / ...") sinon vous obtiendrez une FileNotFoundException
la source
Environment.getExternalStorageDirectory().getAbsolutePath()
pour obtenir un chemin vers sdcard. N'oubliez pas non plus de vérifier si le stockage externe est monté -Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
( Mannaz )J'ai trouvé ce billet de blog très utile, son utilisation de loopJ pour télécharger le fichier, il n'a qu'une seule fonction simple, sera utile à certains nouveaux gars Android.
la source
Alors que je commençais à apprendre le développement Android, j'avais appris que c'était
ProgressDialog
la voie à suivre. Il existe unesetProgress
méthodeProgressDialog
qui peut être invoquée pour mettre à jour le niveau de progression lors du téléchargement du fichier.Le meilleur que j'ai vu dans de nombreuses applications est qu'elles personnalisent les attributs de cette boîte de dialogue de progression pour donner une meilleure apparence à la boîte de dialogue de progression que la version stock. Bon pour garder l'utilisateur engagé avec une animation comme la grenouille, l'éléphant ou les chats / chiots mignons. Toute animation avec dans la boîte de dialogue de progression attire les utilisateurs et ils n'ont pas envie d'attendre longtemps.
la source
Mon conseil personnel est d'utiliser la boîte de dialogue de progression et de créer avant l'exécution, ou de commencer à
OnPreExecute()
publier souvent la progression si vous utilisez le style horizontal de la barre de progression de la boîte de dialogue de progression. La partie restante est d'optimiser l'algorithme dedoInBackground
.la source
Utilisez la bibliothèque de requêtes Android, très cool en effet.Vous pouvez la changer pour l'utiliser
ProgressDialog
comme vous le voyez dans d'autres exemples, celle-ci affichera la vue de progression de votre mise en page et la masquera une fois terminée.la source
J'ajoute une autre réponse pour une autre solution que j'utilise maintenant parce qu'Android Query est si gros et non entretenu pour rester en bonne santé. J'ai donc déménagé sur ce https://github.com/amitshekhariitbhu/Fast-Android-Networking .
la source
Autorisations
Utilisation de HttpURLConnection
la source
Vous pouvez observer la progression du gestionnaire de téléchargement en utilisant LiveData et coroutines, voir l'essentiel ci-dessous
https://gist.github.com/FhdAlotaibi/678eb1f4fa94475daf74ac491874fc0e
la source
Important
AsyncTask est déconseillé dans Android 11.
Pour plus d'informations, veuillez consulter les articles suivants
Devrait probablement passer au cadre de concordance comme suggéré par Google
la source
Nous pouvons utiliser la coroutine et le gestionnaire de travaux pour télécharger des fichiers dans kotlin.
Ajouter une dépendance dans build.gradle
Classe WorkManager
Commencez à télécharger via Work Manager dans la classe d'activité
la source