2013-02-28 2 views
0

J'ai une base de données de dictionnaire qui contient un total de 99,833 mots mais séparés par lettre. Je suis en train de tester dictionaryA.txt qui contient 3922 mots.Android - Strings.xml par rapport aux fichiers texte. Lequel est plus vite?

Cas 1:

Quand je rentre un mot que je veux regarder en haut, permet de dire « Abacus », Utilisation d'un lecteur tampon, Mon application dit « thèse ne répond pas attendre - Quitter. ». Si je choisis d'attendre, il retournera le mot abaque et sa définition.

CODE:

InputStream inputStream = getResources().openRawResource(R.raw.definitiona); 
        try { 
         BufferedReader in = new BufferedReader(new InputStreamReader(inputStream)); 
         String s = in.readLine(); 
         String delimiter = " - "; 
         String del[]; 
         while(s != null) 
         { 
          s = in.readLine().replaceAll("\\s+", " "); 
          del = s.split(delimiter); 
          if (enhancedStem.equals(del[0])) 
          { 
           in.close(); 
           databaseOutput.setText(s); 
           break; 
          }       
         } 
         in.close(); 
         } 
        catch (FileNotFoundException e) { 
         databaseOutput.setText("" + e); 
        } 
        catch (IOException e1) { 
         databaseOutput.setText("" + e1); 
        } 

Cas n ° 2:

Quand je rentre un mot que je veux regarder en haut, laisse dire "Abacus", en utilisant le strings.xml (i transféré les 3922 mots entiers en un string-array), il dit la même chose. Je dois cliquer sur Attendre avant de répondre.

CODE:

String[] wordA = getResources().getStringArray(R.array.DictionaryA); 
       String delimiter = " - "; 
       String[] del; 
       for (int wordActr = 0; wordActr <= wordA.length - 1; wordActr++) 
       { 
        String wordString = wordA[wordActr].toString(); 
        del = wordString.split(delimiter); 

        if (enhancedStem.equals(del[0])) 
        { 
         databaseOutput.setText(wordA[wordActr]); 
         break; 
        } 
        else 
         databaseOutput.setText("Word not found!"); 

       } 

Pouvez-vous me dire ce qui est mieux? Devrais-je continuer à utiliser mon fichier texte? Ou transférez-les dans le fichier strings.xml car ils répondent tous les deux lentement de toute façon? Et avez-vous une idée de comment je peux éliminer le problème "Ne répond pas"? Merci d'avance!

+0

montrent un code ... –

+1

Does not garance, le problème est que vous geler l'interface utilisateur en faisant soulever des objets lourds sur l'interface utilisateur fil. –

+1

Vous devez utiliser une base de données SQLite réelle, pas un fichier texte ou strings.xml. –

Répondre

1

Vous rencontrez le message d'attente parce que vous effectuez une opération lourde dans le thread principal. Vous pouvez éliminer le message d'attente en utilisant Threads ou AsyncTask

Utilisation de strings.xml est recommandé par Google pour les cas d'utilisation similaires à la vôtre

+0

Merci pour la réponse! Je vais vérifier sur les liens! –

1

Si vous souhaitez montrer un code, ce serait plus facile. Ma première supposition est que puisque votre interface ne répond pas, vous faites la "tâche de recherche" sur le fil de l'interface utilisateur. L'exécution de tâches lourdes sur le thread de l'interface utilisateur n'est généralement pas une bonne idée, à la place, vous devriez regarder dans AsyncTasks, Threads ou autre chose, ce qui convient le mieux. En exécutant la tâche en arrière-plan, l'utilisateur peut toujours interagir avec votre application - par exemple, arrêter la tâche de recherche s'il a une faute de frappe dans sa recherche ou ne s'en soucie plus. Jusqu'à ce que la recherche soit terminée et que les résultats soient récupérés, vous pouvez simplement afficher une sorte de wait-dialog.

Laquelle de vos deux suggestions est la plus rapide que je ne peux pas dire. Vous pouvez créer deux threads, les deux faisant un chemin et mesurer le temps.

+0

Bonjour! J'ai mis à jour le code. Merci pour l'information. Je pense que c'est ce que je fais puisque je n'ai pas mis de code sur Threads et AsyncTasks. Je vais vérifier sur le site comment cela peut-il être fait. Je vous remercie! –

0

99,833 mots peuvent être stockés dans moins de 2 Mo

Dans ce cas, le plus rapide est de garder en mémoire, le cas 3 :)

+0

Pouvez-vous me dire comment je peux réduire à 2 Mo? –

+0

lire tout dans ArrayList ou autre collection, peut-être vous avez besoin d'une paire clé-valeur: Hashtable ou quelque chose comme ça, la version non synchronisée est plus rapide que celle synchoronisée. Pour stocker dans la persistance je voudrais utiliser le fichier binaire, et pour sûr pas xml –

2

Les principaux avantages de l'utilisation d'un fichier XML sur un fichier texte sont

  1. Si a une structure bien définie, l'analyse est donc une tâche facile.
  2. Vous pouvez également définir un schéma pour le fichier XML et vous pouvez ainsi facilement traverser le fichier xml et devenir de type sécurisé.
  3. Meilleure performance.
  4. Plus fiable.

donc son mieux utiliser xml ...

+0

Merci! Je vais aller pour la méthode xml alors! :) –

+0

Vous êtes les bienvenus :) Cordialement. –

Questions connexes