démarrer une nouvelle Android Activité est si lent
Je veux ouvrir une nouvelle Activité:
Intent intent = new Intent(homeScreen.this, EmployeeService.class);
Bundle b = new Bundle();
b.putInt(Constants.SERVICE_DETAIL_L1_ID_MSG, ServiceIndex.SRV_L1_EMPLOYMENT);
b.putInt(Constants.SERVICE_DETAIL_FOCUS_POS_MSG, 2);
intent.putExtras(b);
startActivity(intent);
Mais il faut tellement de temps pour faire des Activités à la destination (EmployeeService) deviennent visibles. De Logcat, je vois:
05-14 23:43:31.727: INFO/ActivityManager(59): Displayed activity fr.playsoft.happylille/.employee.EmployeeService: 7050 ms (total 7050 ms)
Je n'en reviens pas prendre plus de 7 secondes pour ouvrir une nouvelle Activité. - Je ajouter un journal dans onCreate (), mais voir qu'il ne faut 5ms pour terminer onCreate.
Quelqu'un peut me dire comment trouver la racine de ce problème?
OK. Je sais pas pourquoi. Parce que dans la cible de l'Activité, j'ai mis tvDesc.setText(Html.fromHtml(desc)); desc est le contenu d'une longue page web avec la balise HTML. Processus de page HTML avec pas-de balises prises en charge en faire mon Activité lentement écran!
Vous pourriez mettre le traitement dans un thread séparé.
c'est vraiment une bonne idée. Maintenant il fonctionne bien.
pouvez-vous me donner un exemple. Disons que nous avons pour la boucle, et nous avons besoin de l'exécuter sur onCreate. comment peut-on le faire dans un thread différent ?
Vous pourriez mettre le traitement dans un thread séparé.
c'est vraiment une bonne idée. Maintenant il fonctionne bien.
pouvez-vous me donner un exemple. Disons que nous avons pour la boucle, et nous avons besoin de l'exécuter sur onCreate. comment peut-on le faire dans un thread différent ?
OriginalL'auteur anticafe | 2011-05-14
Vous devez vous connecter pour publier un commentaire.
Vous devez déplacer le code
Html.fromHtml(desc);
à un thread pour l'avoir asynchrone. Ce thread peut en toute sécurité être lancé au cours de l'onCreate()
de la nouvellement ouvertActivity
.À la fin de ce thread, vous pouvez exécuter
tvDesc.setText()
du thread d'INTERFACE utilisateur:Plus généralement, de 7 secondes sur un périphérique peut-être moyen de 20 sur l'autre, de sorte méfiez-vous de l'ANR!
(Édité en outre à Garçon'commentaire ci-dessous, l'ancienne version de cette réponse n'était plus précis/valide)
Quand j'ai écrit cela, j'étais sur l'API de niveau 8. C'était un travail, mais je n'ai pas re-tester depuis (pas besoin). Je ne peux donc pas sûr que ce soit toujours valide, avez-vous essayer?
Je n'ai pas retester, parce que j'étais à peu près sûr. Mais je viens de le faire et de publier un nouvel élément de réponse, le texte serait trop long ici
Ah, donc vous re-testé! Merci pour la mise à jour de garçon, j'ai corrigé cette réponse.
Ok, enlevé le downvote 😉
OriginalL'auteur Shlublu
Shlublu réponse est incorrect, vous n'êtes pas autorisé à faire de l'INTERFACE utilisateur des mises à jour de non-INTERFACE fils!
Il semble fonctionner dans un premier temps, mais c'est juste de la chance, du timing.
juste un petit laid test prouve qu'il va aller de mal au bon timing. Ici, j'ai mis un texte toutes les 100 ms. Crash en 1 seconde environ:
Il va lancer cette erreur:
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
Je pense que vous devriez exécuter le
Html.fromHtml(desc)
via unAsyncTask
ou RxJavaOriginalL'auteur Boy
ouverte à une nouvelle activité de code à mettre dans le Thread . et d'exécuter du code peut être moins de temps à besoin d'ouvrir une autre activité..peut être utilement.
OriginalL'auteur Kundan Chaudhary