Quelle est la meilleure approche pour télécharger 1000+ enregistrements sur un serveur qui contient également des images pour chaque enregistrement depuis une application iOS / Android?

J'ai une application fonctionnant hors connexion. On suppose que plus de 1000 enregistrements sont créés avec des images dans chaque enregistrement pendant cette période et chaque fois que la connectivité est établie. Quelle devrait être l'approche pour envoyer tous les 1000 + enregistrements au serveur qui gère également toute interruption entre les appels réseau ou la réponse à l'échec de l'API.

Je suppose que je dois envoyer des enregistrements en lots, mais comment gérer l'interruption et maintenir la cohérence et éviter tout type de perte de données.

  • Comment style PopupMenu?
  • Comment remplacer correctement les méthodes de SpinnerAdapter
  • Cycle de Dagger 2 d'un composant, d'un module et d'une portée
  • Android - comment annuler l'enregistrement d'un récepteur créé dans le manifeste?
  • Demandez l'application de l'application Android à l'application de mise à jour si la version actuelle <> version du marché
  • Comment accéder à toutes les cartes SD, en utilisant la nouvelle API Lollipop?
  • Android SeekBar pour contrôler les progrès de MediaPlayer
  • Android: <include> avec RippleEffect & StateListAnimator
  • Quel a été le travail sur le développement mobile multiplate-forme?
  • Comment changer la taille de la barre d'action
  • Différence entre le code avant et après super ()
  • Java.lang.NoClassDefFoundError: com.google.android.gms.R $ styleable dans Android
  • 9 Solutions collect form web for “Quelle est la meilleure approche pour télécharger 1000+ enregistrements sur un serveur qui contient également des images pour chaque enregistrement depuis une application iOS / Android?”

    Je suppose que la meilleure façon ici est d'envoyer chaque enregistrement séparément (s'ils ne sont pas liés les uns aux autres).

    Si vous avez des pièces jointes aux médias, l'envoi de chaque enregistrement prendra 2 secondes en moyenne, si vous téléchargez via Internet mobile avec une vitesse ~ 2 Mo / s. Si vous envoyez le grand lot d'enregistrements via chaque demande, vous devez avoir une connexion stable pendant une longue période.

    Vous pouvez envoyer chaque enregistrement en tant que demande multipartite, où les pièces sont le corps de l'enregistrement et les pièces jointes aux médias.

    Aussi, vous n'avez pas besoin de vérifier la connexion à Internet, ou utilisez le récepteur pour attraper les changements d'état de connexion. Vous pouvez simplement utiliser ces bibliothèques pour déclencher des requêtes de synchronisation:

    1. JobScheduler
    2. Firebase JobDispatcher
    3. Evernote android-job

    Je suggérerais d'utiliser l'API de la base de données Firebase. Il a eu de bonnes implémentations hors ligne / en ligne / synchronisation.

    https://firebase.google.com/docs/database/

    Et il est possible de lire / écrire les données en utilisant Admin SDK pour votre serveur NodeJS:

    https://firebase.google.com/docs/admin/setup

    Enregistrez vos enregistrements dans Db local et utilisez les ORM pour cela. Utiliser un réaménagement qui fournit la méthode onSuccess et onFailure pour les appels Webservice. Pour envoyer des données au serveur à intervalles réguliers, vous pouvez utiliser l'adaptateur de synchronisation.

    • 1er J'ai besoin de savoir comment avez-vous sauvegardé l'image dans le db local?
    • Vous devez créer un service pour attraper l'état de la connexion. Chaque fois que la connexion est établie, vous soumettez votre enregistrement en tant que type Multipart. Vous pouvez réinitialiser / Asynctask.
    • Il suffit de soumettre 1 enregistrement par rétrofit / Asynctask, il vous permet de gérer le succès / l'échec de chaque enregistrement.
    • Vous pouvez exécuter une simple ou multi-adaptation / asynctask pour soumettre un ou plusieurs enregistrements, c'est à votre charge.
    • Si vos données ont une image, du côté du serveur, vous devez gérer le processus de votre serveur au 3ème serveur (serveur pour enregistrer l'image).

    Il s'agit d'une question très large qui concerne l'architecture, l'expérience de l'interface utilisateur, les limitations, etc.

    Il semble que ce soit un modèle de synchronisation où l'utilisateur peut interagir avec les données localement et hors ligne, mais à un moment donné, vous devez synchroniser les données locales avec le serveur et vice versa.

    Je crois que le meilleur endroit pour commencer est avec un service d'arrière-plan (Android, pas sûr s'il existe une approche similaire sur iOS). Essentiellement, que l'application Android fonctionne ou non, le service doit gérer toute la synchronisation, l'interruption et l'échec en arrière-plan.

    S'il s'agit d'un db local, vous devriez gérer l'ouverture et la fermeture de la base de données de manière appropriée et je suggérerais d'utiliser un champ pour marquer tous les enregistrements synchronisés, donc, si certains enregistrements échouaient, vous pouvez les répéter à un autre point. En outre, vous pouvez convertir les enregistrements sur json array, puis faire une demande de publication. En ce qui concerne le téléchargement d'images, il faut absolument être en lots si beaucoup d'entre eux, mais aussi s'assurer de garder trace de ceux qui sont téléchargés et de ceux qui ne le sont pas.

    Le problème que vous rencontrerez si vous supportez la synchronisation à partir de différents périphériques et plates-formes est que vous disposez de données contradictoires synchronisées sur le backend. Vous aurez besoin de traiter cette affaire sinon, il pourrait être très désordonné et probablement causer beaucoup de problèmes étranges.

    J'espère que ça aide sur un niveau élevé 🙂

    Pour prendre une approche simple, avoir 1 drapeau dans vos classes de données [NSManagedObject] en tant que synchro. En créant un nouvel objet / en modifiant un indicateur de synchronisation de changement d'objet existant sur false .

    Filtrer les objets de données avec la valeur de synchronisation comme faux.

    let unsyncedFilter = NSPredicate(format: "sync = %@", @(false)) 

    Maintenant, vous disposez d'un ensemble d'objets que vous souhaitez synchroniser avec le serveur. Si vous envoyez des objets un par un dans les requêtes. En cas de succès, modifiez le drapeau de synchronisation pour en faire autrement chaque fois que votre fonction sera exécutée à nouveau lors de la mise à jour de l'état de lancement / atteinte de l'application, elle filtrera de nouveau les données non synchronisées et démarrera la synchronisation.

    Vous pouvez utiliser l'approche de division et de conquête, divisez la tâche en une petite tâche et téléchargez les données vers le serveur. 1. prenez un drapeau booléen "isFinishData" commençant par faux. 2. commencer à télécharger les données sur le serveur de 0 à 100 enregistrements. 3. l'enregistrement suivant envoie de 100 à 200. 4. ce processus s'exécute jusqu'à ce que le dernier enregistrement (1000) ne soit pas envoyé. 5. dans la dernière mise à jour de l'enregistrement, la variable booléenne est vraie et sort de la boucle.

    Cette logique fonctionnerait bien dans IOS / Android tous les deux.

    Comme d'autres l'ont mentionné, il s'agit d'une question assez large. Beaucoup dépend de l'architecture du serveur qui recevra les données ainsi que l'architecture de l'application.

    Si vous avez un contrôle sur la mise en œuvre de votre backend, je vous recommande de mettre en œuvre une solution de stockage qui permet de faire une pause et de reprendre les transferts. Google Cloud Storage et Amazon S3 offrent une fonctionnalité similaire.

    L'idée derrière cette approche est de pouvoir ramasser le chargement d'où il s'est arrêté. En cas de crash de l'application ou de problèmes liés à la connexion Internet, il n'est pas nécessaire de redémarrer le tout dès le début. Dans votre cas, je commencerais toujours des téléchargements séparés pour chacun des enregistrements et stockerais leur progression de téléchargement.

    Ici, vous pouvez trouver un exemple de la façon d'utiliser l'approche pause / resume en utilisant le SDK mobile avec Amazon https://aws.amazon.com/blogs/mobile/pause-and-resume-amazon-s3-transfers-using-the -aws-mobile-sdk-for-android / .

    Modification de l'ajout de référence à Amazon iOS SDK, http://docs.aws.amazon.com/mobile/sdkforios/developerguide/s3transfermanager.html

    La meilleure façon est de briser les fichiers en morceaux de 100s et de télécharger à intervalles ou lorsque l'application est inactif.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.