2010-11-17 22 views
1

Je suis en train de concevoir une application qui feuillette une série d'images, comme feuilleter un album photo. Des trucs plutôt standards, j'en suis sûr. Depuis que l'image doit être regardée pendant quelques secondes avant qu'elle ne change automatiquement de l'image suivante, j'ai décidé d'utiliser un fil qui montre la photo, attend quelques secondes et ensuite continue.Problème de filetage avec Java et Android

Picthread(ImageView Image1) { 
     this.image = Image1; 

    } 

    public void run(){ 

     showPicture(image); 
     animal_array = new String[7]; 

     while (counter < 7){ 
      try{ 


       int timer = 0; 

       while (timer < 2000){ 

        sleep(500); 

        timer+=500; 
       } 
       image.post(new Runnable(){ 

        public void run() { 

         showPicture(image); 


        } 

       }); 



      } 
      catch (InterruptedException e) { 
       } 
     } 




    } 

Ceci a fonctionné. showPictures est une méthode très simple qui choisit une image et la place sur un ImageView. Il n'est pas nécessaire de le savoir pour mon problème. Au début ça ne marchait pas, le logcat disait que je ne pouvais pas toucher une vue sur une vue hiérarchique qui n'était pas créée dans ce fil. Je n'étais pas sûr de ce que cela signifiait donc j'ai fait le

image.post(...) 

code. Qui a fonctionné. Ma question principale est: Pourquoi était-ce nécessaire? Si vous regardez mon code ci-dessus, la première méthode showPicture() n'est pas dans le code image.post(). Mais aucune exception n'est enregistrée. Je ne comprends pas cela, pourquoi un poste n'est-il pas nécessaire? Mais aussi pourquoi ai-je besoin de poster, puisque Image est une variable de classe, et je pensais pouvoir être vu par tous les threads. J'étais heureux que cela a fonctionné, mais perplexe.

S'il vous plaît garder à l'esprit, c'est ma première tentative de threading en Java sur rien de plus que des exemples de manuels triviaux. Donc, je suis encore assez confus.

Par ailleurs, à la fin je laissé tomber tout le fil, et tout a fait

new Thread(new Runnable() { 
      public void run() {...} 

Répondre

1

Quand vous faites des « choses » avec l'interface graphique, vous devez toujours être sur le fil de l'interface graphique. C'est ce que fait View.post(Runnable), en veillant à ce que le thread gui fasse le travail du runnable.

Même si vos showImage œuvres une fois ne signifie pas que cela fonctionne toujours ...

+0

Merci pour la réponse. OK, mais pourquoi showPicture a-t-il fonctionné une fois sans post()? De même, devrais-je ne jamais définir un thread de classe interne pour une application GUI? –

+0

@JJG, qu'est-ce que showImage fait (code)? – dacwe