2010-12-09 6 views
11

J'ai un problème. J'ai besoin d'aller d'une activité à l'autre. Ma deuxième activité a une grande mise en page xml, avec beaucoup d'éléments (je parle environ de quatre cents aprox.), Puis cela prend quelques secondes (trop) pour montrer cette deuxième activité.Comment afficher un dialogue de progression entre deux activités?

Comment afficher une boîte de dialogue de progression entre deux activités? J'essaye d'utiliser une tâche de fond pour faire ceci.

J'ai cette méthode dans mon activité A:

private void goToYear() { 
    Intent intent = new Intent(); 
    intent.setClass (getBaseContext(), YearActivity.class); 
    startActivity(intent); 
    } 

Et dans mon activité B:

public class YearActivity extends Activity { 

private String TAG = "YearActivity ::"; 

private ProgressDialog pd = null; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // Show the ProgressDialog on this thread 
     this.pd = ProgressDialog.show(this, "Working...", "Calculating the screen...", true, false); 

     // Start a new thread that will download all the data 
     new MakeYearTask().execute(); 

    } 

    private void initCalendar() { 
     this.setContentView(R.layout.calendar_year); 

    ... 
    ... 
    initialize values 
    ... 
    ... 

    } 


    private class MakeYearTask extends AsyncTask<String, Void, Object> { 
     protected Void doInBackground(String... args) { 
      Log.i("YearActivity::MakeYearTask", "MakeYearTask Background thread starting"); 

    YearActivity.this.initCalendar(); 


     } 

     protected void onPostExecute(Object result) { 

      if (YearActivity.this.pd != null) { 
      YearActivity.this.pd.dismiss(); 
      } 
     } 
    } 
} 

Vous pouvez voir que je fais la setContentView de la méthode onCreate.

Cela ne fonctionne pas. Il me fait une exception, comme ceci:

12-09 19:49:17.729: ERROR/AndroidRuntime(218): java.lang.RuntimeException: An error occured while executing doInBackground() 
12-09 19:49:17.729: ERROR/AndroidRuntime(218):  at android.os.AsyncTask$3.done(AsyncTask.java:200) 
12-09 19:49:17.729: ERROR/AndroidRuntime(218):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:234) 
12-09 19:49:17.729: ERROR/AndroidRuntime(218):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:258) 
12-09 19:49:17.729: ERROR/AndroidRuntime(218):  at java.util.concurrent.FutureTask.run(FutureTask.java:122) 
12-09 19:49:17.729: ERROR/AndroidRuntime(218):  at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:648) 
12-09 19:49:17.729: ERROR/AndroidRuntime(218):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:673) 
12-09 19:49:17.729: ERROR/AndroidRuntime(218):  at java.lang.Thread.run(Thread.java:1060) 
12-09 19:49:17.729: ERROR/AndroidRuntime(218): Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
12-09 19:49:17.729: ERROR/AndroidRuntime(218):  at android.view.ViewRoot.checkThread(ViewRoot.java:2629) 
12-09 19:49:17.729: ERROR/AndroidRuntime(218):  at android.view.ViewRoot.requestLayout(ViewRoot.java:545) 
12-09 19:49:17.729: ERROR/AndroidRuntime(218):  at android.view.View.requestLayout(View.java:7657) 
12-09 19:49:17.729: ERROR/AndroidRuntime(218):  at android.view.ViewGroup.addView(ViewGroup.java:1749) 
12-09 19:49:17.729: ERROR/AndroidRuntime(218):  at android.view.ViewGroup.addView(ViewGroup.java:1731) 
12-09 19:49:17.729: ERROR/AndroidRuntime(218):  at com.android.internal.policy.impl.PhoneWindow.generateLayout(PhoneWindow.java:2186) 
12-09 19:49:17.729: ERROR/AndroidRuntime(218):  at com.android.internal.policy.impl.PhoneWindow.installDecor(PhoneWindow.java:2239) 
12-09 19:49:17.729: ERROR/AndroidRuntime(218):  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:309) 
12-09 19:49:17.729: ERROR/AndroidRuntime(218):  at android.app.Activity.setContentView(Activity.java:1620) 
12-09 19:49:17.729: ERROR/AndroidRuntime(218):  at es.jota.app.YearActivity.initCalendar(YearActivity.java:42) 
12-09 19:49:17.729: ERROR/AndroidRuntime(218):  at es.jota.app.YearActivity.access$0(YearActivity.java:41) 
12-09 19:49:17.729: ERROR/AndroidRuntime(218):  at es.jota.app.YearActivity.initCalendar$MakeYearTask.doInBackground(YearActivity.java:120) 
12-09 19:49:17.729: ERROR/AndroidRuntime(218):  at es.jota.app.YearActivity.initCalendar$MakeYearTask.doInBackground(YearActivity.java:1) 
12-09 19:49:17.729: ERROR/AndroidRuntime(218):  at android.os.AsyncTask$2.call(AsyncTask.java:185) 
12-09 19:49:17.729: ERROR/AndroidRuntime(218):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:256) 
12-09 19:49:17.729: ERROR/AndroidRuntime(218):  ... 4 more 
+0

Réponse comment créer une barre de progression entre deux activité [link] (http://stackoverflow.com/questions/1979524/android-splashscreen) –

Répondre

0

Cela peut ne pas être la meilleure solution, mais ce que vous pouvez faire est de prolonger le thème de base utilisé dans Android et définir l'arrière-plan de la fenêtre à une image qui indique l'activité est en cours de chargement . Définissez ensuite ce thème sur Activité B. Maintenant, lorsque l'activité B est en cours de chargement, elle affichera votre dessin au lieu de la fenêtre noire. Vous pouvez même être créatif avec une liste d'animation et obtenir un effet de chargement indéterminé.

+0

Mmmm. Je pense comme vous, mais si ça marche, ça ira pour moi :) Je vais essayer ça, et je vous dis ce qui s'est passé. Merci. –

+0

Je ne l'ai pas encore essayé, mais j'ai mis dans ma liste de choses à faire. Quand j'essaie cela, je vous dis le résultat. Merci! –

+0

hâte d'entendre/voir les résultats – schwiz

0

Avez-vous essayé de faire new MakeYearTask().execute(); dans onResume() à la place?

Bien que n'étant pas élégant, vous pouvez déclencher un post-fil retardé sur créer pour attendre quelques millis.

Edit:

Je viens de cette erreur:

(Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views) 

vous sont en train de modifier l'interface utilisateur du AsyncTask?

Vous devez simplement générer les données dans doInBackground(), mais mettre à jour l'interface utilisateur dans onPostExecute().

+0

Oui, maintenant, avec le même résultat. :( Merci dans tous les cas –

+0

Edité ma réponse avec info supplémentaire Peut-être que c'est – blindstuff

+0

J'essaie tout ça ... merci, mais je ne peux pas le faire travailler !! :( –

0

Votre formatage est un peu éteint, mais si je comprends bien, vous appelez initCalendar() dans votre AsyncTaskdoInBackground(). Vous n'êtes pas autorisé à le faire avec AsyncTask s.

utilisation doInBackground() pour les opérations de longue durée tels que les appels HTTP, DB accès, etc. Une fois que vous avez les choses dont vous avez besoin, appelez initCalendar() de onPostExecute().

+0

Désolé pour le format. il: D Je vais essayer de comprendre votre réponse Je suis espagnol et mon anglais n'est pas si bon –

+0

Fondamentalement, ce que je dis est déplacer ce 'YearActivity.this.initCalendar();' à ' OnPostExecute() 'méthode, et je suis en train d'expliquer pourquoi. :) – Zarah

+0

Merci par l'explication: D. J'essaie, mais ne fonctionne pas :( –

1

C'est une mauvaise conception pour commencer. Si vous avez une quantité importante de données à présenter à l'utilisateur, il est préférable d'utiliser une sous-classe AdapterView, par exemple ListView ou GridView. Une mise en page XML avec près de 400 éléments est incroyablement grande.

Je comprends ce que vous essayez de faire (vous essayez d'effectuer la construction longue de la hiérarchie View massive sur une Thread séparée en utilisant un AsyncTask, mais ce que vous avez trouvé est qu'il est soufflé sur vous pour essayer de toucher la hiérarchie View sur une non-interface utilisateur Thread).

Même si vous avez réussi à implémenter une sorte de barre de progression au premier plan pendant la construction de la hiérarchie, je ne suis pas sûr que le système fournirait les moyens de rappeler les informations de progression pendant qu'il gonfle la hiérarchie View (mais je peux me tromper).

AdapterView s ont été créés pour résoudre exactement ce genre de problème. Avec AdapterView, en règle générale, seule la valeur Views de l'écran existe en mémoire à tout moment. Par exemple, vous pouvez avoir une table avec un millier de lignes, mais avec seulement sept lignes correspondant à l'écran à la fois, seulement huit lignes View peuvent exister dans la mémoire à la fois. De plus, l'adaptateur doit également recycler les View, optimisant ainsi les performances.

+0

Et si vous deviez concevoir un écran qui contient une table qui devrait être défilée horizontalement et verticalement, comment résoudriez-vous en utilisant un adaptateur? –

+0

Bon point J'ai brièvement cherché et trouvé plusieurs questions SO qui suggèrent une mise en page adaptable horizontalement et verticalement à base d'adaptateur est possible avec un peu de travail (par exemple http://stackoverflow.com/questions/7681581/android -viewview-in-horizontalscrollview-performance-issues) Je pense que si l'OP subit un retard excessif pendant le gonflage dans '.setContentView()', alors les performances globales risquent d'être léthargiques (peut-être sur des périphériques plus lents) la mise en page basée est valable, même si cela signifie un peu de douleur pour le faire fonctionner, ou repenser l'interface utilisateur un peu – Trevor

+0

En fait, je suis d'accord, je n'avais que ce problème ici: http://stackoverflow.com/questions/15559851/viewpager-with-fragments-that-contain-tablelayouts-loads-slowly et cherche toujours une solution. Mais merci:) –

Questions connexes