IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Récupérer des données au lancement d'une application


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 118
    Par défaut Récupérer des données au lancement d'une application
    Bonjour,

    Je suis en train de réaliser une application de bus qui lors de son premier lancement parse un fichier JSON via une URL et enregistre toutes les données de celui-ci (lignes, stations, horaires etc.) dans une BD locale SQLite.

    Malheureusement, l'écriture en BD prend énormément de temps (environ 2 minutes pour seulement 6 lignes de bus...).
    Pour l'instant, j'ai mis ça dans une AsynTask qui s'exécute au premier lancement de l'application, et j'affiche une ProgressBar le temps de son exécution.
    Sauf que ce n'est pas très sérieux de faire patienter l'utilisateur 2 minutes, en sachant que je vais rajouter des lignes de bus et que ce temps d'attente va augmenter.

    Du coup, est-ce que vous avez une idée de comment je peux faire pour gérer ça ?

    La dernière idée que j'ai eu, c'est d'exécuter un service au lancement de l'application qui va récupérer les données, et une fois terminé, on envoie une notification à l'utilisateur pour lui dire qu'il peut utiliser l'application. Au moins entre temps il peut faire ce qu'il veut et n'a pas à patienter.
    Qu'en pensez vous? Est-ce que c'est possible de démarrer une application avec un service et sans activité? Ou carrément est-ce qu'il existe mieux comme solution?

    Je prends toutes idées et tous conseils! Merci!

  2. #2
    Membre expérimenté Avatar de Altak
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 170
    Par défaut
    Bonjour,

    Ce que tu peux faire, c'est d’intégrer une db locale directement dans ton apk.
    Génère une première fois ta base donnée et ajoute la dans tes assets. Tu n'as plus qu'a la récupérer a ton premier lancement.
    Tu devras ensuite ajouter une date de dernière mis à jour dans ta requête d'update et ne retourner que les entités qui ont été modifié/créé après cette date.

    Si tu mets a jour régulièrement ton apk sur le store (en mettant a jour la base de donnée), cela devrait réduire énormément le temps de chargement a la première utilisation.

    GL HF

  3. #3
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    2 minutes pour 6 lignes de bus me semblent d'entrée exagéré...

    Pourrais-tu partager avec nous la structure de la BDD et le code qui va la remplir (en arrière plan) ?

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Pour accélérer des insertions la première choses à faire est de les faire au sein d'une transaction, dans certains cas , on gagne déjà un facteur 2.
    Si cela n'est pas suffisant tu peux éventuellement jouer sur le pragma synchronous de sqlite qui par défaut est à full : https://www.sqlite.org/pragma.html#pragma_synchronous

    Le passer à NORMAL est plutôt sûr, le passer à OFF est en revanche risqué puisque tu prend le risque de corrompre ta base si quelque chose se passe mal.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Invité
    Invité(e)
    Par défaut
    As-tu vraiment besoin de toutes les données des 6 lignes de bus ?
    Le rapatriement des données distante ne se fait qu'une seule fois au lancement de l'application, comme tu les as sur ta bases locale ensuite, pourquoi le refaire a chaque lancement ? Certes, les données peuvent peut-être évoluer sur le serveur distant, mais une ligne de bus, ça n'est pas modifier tout les jours.
    Ça me semble étrangement gros 2 minutes pour 6 lignes de bus. Es-tu sûr que se sont les requêtes d'insertion qui te prennent du temps ?
    Comment récupères-tu ton JSON ?

  6. #6
    Membre confirmé

    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 118
    Par défaut
    Désolé de repasser si tardivement, merci à tous pour vos retours!
    J'ai depuis ajouter une transaction qui contient toutes mes insertions et je suis passé de 3 minutes à 30 secondes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SQLiteDatabase db = this.dh.getWritableDatabase();
    db.beginTransactionNonExclusive();
    // insertions
    db.setTransactionSuccessful();
    db.endTransaction();
    db.close();
    Ensuite, j'ai remplacé ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ContentValues values = new ContentValues();
    values.put(key, value);
    db.insert(table, null, values);
    Par l'utilisation de SQLiteStatement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    String sql = "INSERT OR REPLACE INTO " + table + " ( " +  key+ ") VALUES (?)";
    SQLiteStatement stmt = db.compileStatement(sql);
    stmt.bindString(1, value);
    stmt.execute();
    stmt.clearBindings();
    Ce qui m'a fait passer à 27 secondes.

    Enfin, avant chaque insertion, je faisais un test pour vérifier que le tuple n'existait pas dans la table (un genre de getCount). J'ai tout simplement supprimé ce test (possible grâce à l'utilisation de REPLACE dans la requête) et je suis passé à 14 secondes!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 06/01/2011, 17h53
  2. [Exécutable]lancement d'une application
    Par jesus144 dans le forum Général Java
    Réponses: 9
    Dernier message: 08/06/2005, 10h08
  3. [Plugin][MyEclipse]Lancement d'une application J2EE
    Par ujoodha dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 20/04/2005, 15h48
  4. Détecter le lancement d'une application
    Par Neilos dans le forum Windows
    Réponses: 8
    Dernier message: 22/11/2004, 12h32
  5. Lancement d'une application en local (!)
    Par Fifoun dans le forum MFC
    Réponses: 5
    Dernier message: 12/06/2004, 17h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo