9
votes

La performance de fragmenttabhost est lente?

J'ai utilise le support v4 lib lib pour fragmenttabhost

L'exigence est que lorsque je chante une tabulation, une autre et une autre, appelante

OnCreateView () & OnActivityCreated () à chaque fois.

C'est pourquoi mes performances de code sont lentes.

Donc, toutes les autres solutions? Comment augmenter les performances dans l'onglet Fragment?


2 commentaires

Pourriez-vous publier votre code à partir de OnCreateView () et OnActivityCreated () ?


Avez-vous essayé SetRetaNInstance (True) dans vos fragments?


4 Réponses :


9
votes

sonne comme une odeur de conception.

Redesignez votre code afin que le travail lourd soit fait de manière asynchrone. Les fragments devraient pouvoir être construits rapidement. S'il y a un grand traitement qui doit être effectué pour qu'un fragment d'afficher des informations utiles, ce travail doit être effectué à l'avance ou de manière asynchrone après la création du fragment et que le fragment doit être notifié pour mettre à jour son contenu lorsque le travail est terminé. .


1 commentaires

D'accord. Si OnCreateView () ou OnActivityCreated () Prenez plus de quelques millisecondes combinées, vous le faites mal.



1
votes

La première chose que vous devriez prendre en charge est de regarder des calculs / chargement d'un grand jeu de données doit être des endroits sur un fil de travail différent de celui de l'interface utilisateur principal. La meilleure option pour faire cela (à mon avis) est d'utiliser asyncktask code>. Vous pouvez utiliser quelque chose comme celui-ci dans votre fragment:

private class LoadData extends AsyncTask<Void, Void, Void>{

      @Override
      protected void onPreExecute(){
          super.onPreExecute();
          // this is the place where you can show
          // progressbar for example to indicate the user
          // that there is something which is happening/loading in the background
      }

      @Override
      protected void doInBackground(Void... params){

          // that's the place where you should do 
          // 'the heavy' process which should run on background thread
      }

      @Override
      protected void onPostExecute(Void result){
          super.onPostExecute();
          // you should update your UI here.
          // For example set your listview's adapter
          // changes button states, set text to textview and etc.
      }
}


0 commentaires

0
votes

Ajout à Android-Developer: Si vous utilisez déjà l'asyncaptage, rappelez-vous que même lorsque vous utilisez plusieurs systèmes d'asyncque, ils sont exécutés en arrière-plan, mais tous séquentiellement! Si vous voulez que plus de threads traitent vos tâches, consultez cet article, ce qui explique parfaitement comment y parvenir! exécuter plusieurs masques d'asyncaptage en même temps - impossible?


1 commentaires

Cela dépend de quelle version vous utilisez et du matériel de périphérique. Les tâches ASYNC sont exécutées sur un pool de fils dans laquelle le cas simple est un bassin de 1 fil de travail. Ceci est également la valeur par défaut pour certaines versions du cadre.



1
votes

J'ai trouvé une solution pour cela. J'ai inséré toutes les websevices et le code de transaction de base de données sur la création. Parce que surCréate de ne pas appeler à chaque fois jusqu'à ce que l'ondestroy n'appelle pas. & L'autre solution est également disponible, nous pouvons utiliser

fragment.show ();

& fragment.hide (); Méthode


2 commentaires

On dirait que vous avez la bonne idée. Cependant, l'objectif ultime est que les fragments ne devraient pas avoir à parler à leur activité pour récupérer des données. Ils devraient recevoir toutes les références de ressources nécessaires pour aller leurs données par elles-mêmes. Après tout ce qui est le point de fragments. Les activités sont simplement des conteneurs responsables de l'initialisation et de la navigation.


@saunik Sing: Pouvez-vous s'il vous plaît dire où je dois utiliser Fragment.Show () et fragment.Hide (). Dois-je remplacer la fonction detextChanged ??