2013-01-20 4 views
1

J'ai eu des problèmes avec ViewGroup et ViewPager généré automatiquement. Je veux ajouter une vue et supprimer une vue, mais chaque fois que je suis en train, je reçois l'erreur:Supprimer Afficher dans ViewGroup

01-20 14:05:40.028: E/AndroidRuntime(3615): FATAL EXCEPTION: AsyncTask #1 
    01-20 14:05:40.028: E/AndroidRuntime(3615): java.lang.RuntimeException: An error occured while executing doInBackground() 
    01-20 14:05:40.028: E/AndroidRuntime(3615):  at android.os.AsyncTask$3.done(AsyncTask.java:299) 
    01-20 14:05:40.028: E/AndroidRuntime(3615):  at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) 
    01-20 14:05:40.028: E/AndroidRuntime(3615):  at java.util.concurrent.FutureTask.setException(FutureTask.java:219) 
    01-20 14:05:40.028: E/AndroidRuntime(3615):  at java.util.concurrent.FutureTask.run(FutureTask.java:239) 
    01-20 14:05:40.028: E/AndroidRuntime(3615):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
    01-20 14:05:40.028: E/AndroidRuntime(3615):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
    01-20 14:05:40.028: E/AndroidRuntime(3615):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
    01-20 14:05:40.028: E/AndroidRuntime(3615):  at java.lang.Thread.run(Thread.java:856) 
    01-20 14:05:40.028: E/AndroidRuntime(3615): Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
    01-20 14:05:40.028: E/AndroidRuntime(3615):  at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4746) 
    01-20 14:05:40.028: E/AndroidRuntime(3615):  at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:823) 
    01-20 14:05:40.028: E/AndroidRuntime(3615):  at android.view.View.requestLayout(View.java:15468) 
    01-20 14:05:40.028: E/AndroidRuntime(3615):  at android.view.View.requestLayout(View.java:15468) 
    01-20 14:05:40.028: E/AndroidRuntime(3615):  at android.view.View.requestLayout(View.java:15468) 
    01-20 14:05:40.028: E/AndroidRuntime(3615):  at android.view.View.requestLayout(View.java:15468) 
    01-20 14:05:40.028: E/AndroidRuntime(3615):  at android.view.ViewGroup.removeView(ViewGroup.java:3524) 
    01-20 14:05:40.028: E/AndroidRuntime(3615):  at de.tecfriends.vbtsplash2013.MainActivity$DummySectionFragment.Teilnehmer(MainActivity.java:219) 
    01-20 14:05:40.028: E/AndroidRuntime(3615):  at de.tecfriends.vbtsplash2013.MainActivity$DummySectionFragment$1.onTaskCompleted(MainActivity.java:148) 
    01-20 14:05:40.028: E/AndroidRuntime(3615):  at de.tecfriends.vbtsplash2013.BackgroundDownload.doInBackground(BackgroundDownload.java:38) 
    01-20 14:05:40.028: E/AndroidRuntime(3615):  at de.tecfriends.vbtsplash2013.BackgroundDownload.doInBackground(BackgroundDownload.java:1) 
    01-20 14:05:40.028: E/AndroidRuntime(3615):  at android.os.AsyncTask$2.call(AsyncTask.java:287) 
    01-20 14:05:40.028: E/AndroidRuntime(3615):  at java.util.concurrent.FutureTask.run(FutureTask.java:234) 
    01-20 14:05:40.028: E/AndroidRuntime(3615):  ... 4 more 

Dans la classe onCreateView i définir une ViewGroup publique nommée vGroup. À la fin de tout traitement de données j'essaye de vGroup.removeView(vGroup.findViewById(1)); et vGroup.addView(modeList); mais j'obtiens l'erreur ci-dessus.

Comment puis-je atteindre le original Thread où je peux ajouter et supprimer des vues à ViewGroup?

Répondre

2

ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. signifie que vous essayez d'accéder à des éléments d'interface du fil d'arrière-plan, ce qui est le fil conducteur non-UI.

vGroup.removeView() doit uniquement être appelé à partir de onPreExecute() ou onPostExecute(), car ces deux fonctions s'exécutent sur le thread UI.

private class MyAsyncTask extends AsyncTask<String, Void, String> { 

     @Override 
     protected String doInBackground(String... params) { 
      .... // runs on background/non-UI thread 
     }  

     @Override 
     protected void onPostExecute(String result) { 
      ... // runs on UI thread    
     } 

     @Override 
     protected void onPreExecute() { 
      ... // runs on UI thread  
     } 

     @Override 
     protected void onProgressUpdate(Void... values) { 
     } 
} 

Documentation of AsyncTask.

+0

Donc, je ne peux pas changer la vue après sa création? Et comment puis-je changer pour le fil de l'interface utilisateur? – Styler2go

+0

Vous pouvez certainement! Mais seulement à partir des fonctions preExecute et postExecute. – Swayam

+0

Pouvez-vous également me dire comment atteindre ces fonctions? – Styler2go

1

Vous appelez vGroup.removeView() à partir d'un fil d'arrière-plan. Pour modifier l'interface utilisateur, vous devez/devez toujours utiliser le UI Thread.

EDIT: créer un Handler sur la UIThread et l'utilisation mHandler.post(new Runnable());

+0

Êtes-vous sûr que je suis dans cette discussion de fond? J'appelle la fonction à partir de la fonction 'onTaskCompleted' de BackgroundThread. Juste essayé, je n'ai pas la fonction runOnUiThread dans cette fonction disponible. – Styler2go

+0

oui. aussi les stacktraces disent la même chose. –

+0

Comment puis-je atteindre le thread Ui? runOnUiThread ne semble pas fonctionner. – Styler2go

0

à côté d'utiliser vGroup.removeView() vous devez appeler vGroup.refreshDrawableState()

+0

Voulez-vous dire qu'avant d'utiliser removeView, vous devez d'abord utiliser refreshDrawableState? – GHC