J'ai besoin d'obtenir des images ainsi que d'autres données (très similaire à l'email avec pièces jointes) sur le serveur. Je dois également le faire de manière fiable afin que je puisse réessayer, etc. en cas d'échec.Android télécharger des images sur le serveur de la manière la plus efficace
Serveur est serveur REST WCF et je fais beaucoup d'autres communications avec lui (JSON), mais a juste obtenu cette nouvelle exigence pour télécharger des images.
Depuis que j'utilise JSON pour publier des données sur mon serveur - j'utilise GSON côté Android pour sérialiser les données.
Voici comment je l'ai mis en œuvre jusqu'à présent (tout le reste fonctionne de cette façon mais je commence avec des images)
- champs d'activité de remplissage de l'utilisateur (données texte)
- utilisateur prend une photo (s) via les intentions de la caméra. Actuellement, je viens d'utiliser 1 fichier pour les images
- Je prends l'image de SDCard, charge/redimensionner - représenterez sur ImageView et stocker dans l'octet []
- utilisateur soumet - Je prends toutes les données ainsi que des images de l'octet [] et mis dans Java objet
- convertisseur Appel GSON et objet sérialisation
- Enregistrer objet dans SQLite
- AsyncTask regarde dans SQLite pour les enregistrements, ouvre le curseur et obtenir le texte de
- AsyncTask crée des données texte HttpConnection et messages sur mon serveur.
- LA FIN
maintenant à mes problèmes .. Il est évident que sur # 3 - I "exploser" ram avec mes tableaux d'octets. Parfois, je sens même que mon Nexus S devient lent. Mais en faisant cela - j'évite de remplir la carte SD ou le dossier de l'application avec beaucoup de fichiers. Je prends une photo et je l'attrape. L'image suivante écrasera la précédente.
Étape 5 EST lente. Je n'ai pas essayé le sérialiseur personnalisé sur GSON et au lieu de sérialiser le tableau d'octets dans quelque chose comme [1, -100,123, -12] je peux obtenir une taille beaucoup plus petite avec Base64 mais quand même. Ce sera lent. Et je peux avoir jusqu'à 20 images ...
L'étape # 6 ne pose aucun problème. Mais avec une certaine taille (j'ai essayé 300px image) j'ai commencé à l'erreur à l'étape 7 sur OpenCursor
07-06 20:28:47.113: ERROR/CursorWindow(16292): need to grow: mSize = 1048576, size = 925630, freeSpace() = 402958, numRows = 2
07-06 20:28:47.113: ERROR/CursorWindow(16292): not growing since there are already 2 row(s), max size 1048576
07-06 20:28:47.113: ERROR/Cursor(16292): Failed allocating 925630 bytes for text/blob at 1,1
Donc, tout cela est quelque chose que je ne l'aime. Idéalement, je veux que toutes les données soient téléchargées en une seule pièce sur le serveur.
Je pensais peut-être stocker des images horodatées sur la carte SD et ne stocker que leur nom en DB. Que je les traiterais juste avant d'envoyer au serveur. Et en cas de succès, je supprimerais ces images. Ce type de logique rendra le schéma SQLite beaucoup plus complexe mais peut-être n'y a-t-il pas de meilleur moyen ?! Je suppose que je suis à la recherche de meilleures pratiques pour gérer les images.Comment faire followin avec utilisation de la mémoire/CPU minimale:
- Prenez la photo
- miniature Afficher
- Redimensionner
- Envoyer à un serveur
EDIT 1:
Actuellement Je recherche la possibilité de télécharger shizang entier comme un message MIME en plusieurs parties. Cela nécessiterait l'ajout de certains JAR à mon package Android. Aussi je ne suis pas sûr de savoir comment sera l'efficacité du code Apache pour charger des images et de les envoyer (je pense mieux que mon code) http://okandroidletsgo.wordpress.com/2011/05/30/android-to-wcf-streaming-multi-part-binary-images/
Et que je dois traiter avec l'analyse syntaxique tout cela sur le côté WCF car il n'y a façon de le faire avec le framework .NET intégré.
http://antscode.blogspot.com/2009/11/parsing-multipart-form-data-in-wcf.html
VOUS S'IL VOUS PLAÎT TELL ME SI CE ESSAYÉ!
EDIT 2:
MIME est pas bon. Il n'y a pas de point car il sérialise binaire en utilisant base64 qui est la même chose ..
Vous sauvegardez donc l'image dans la base de données? Cela ferait exploser la taille de la base de données et vos utilisateurs se plaindront que l'application prend trop de place sur le stockage interne du téléphone et demandera le support app2sd de toute façon - pourquoi ne pas conserver les images sur la carte SD? –
@denis J'ai trouvé que la limite de taille du curseur sur Android 1 Mo n'est pas seulement un problème avec le stockage interne, mais aussi je vais atteindre cette limite facilement en sauvegardant ce type de données dans SQLite. On dirait que l'utilisation de stockage externe est seulement la bonne façon de gérer de telles choses – katit