2010-08-05 3 views
7
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    final ThraedDemo objDemo = new ThraedDemo(); 
    Thread objThread = new Thread() { 

     @Override 
     public void run() { 

      objDemo.firstMethod(); 
     } 
    }; 
    objThread.start(); 
} 


class ThraedDemo { 

     private void firstMethod() { 
      Thread objThread = new Thread() { 

       @Override 
       public void run() { 
        try { 
        ((ImageView)findViewById(R.id.ImageViewnumber)).setImageResource(nums[n]); 

         Thread.sleep(10000); 
         Log.v("Thread","1111111111111111sleep"); 
        } catch (InterruptedException ex) { 
         System.out.println("interuped exception" + ex.getMessage()); 
        } 
        secondMethod(); 
       } 

       private void secondMethod() { 
     Thread objThread = new Thread() { 

      @Override 
      public void run() { 
       try { 
       ((ImageView)findViewById(R.id.ImageViewResult)).setImageResource(nums[n+1]); 

       n++; 

        Thread.sleep(10000); 
        Log.v("Thread","22222222222 sleep"); 
       } catch (InterruptedException ex) { 
        System.out.println("interuped exception" + ex.getMessage()); 
       } 
       firstMethod(); 
      } 
     }; 
     objThread.start(); 
    } 

      }; 
      objThread.start(); 
     } 

    } 

J'utilise le code ci-dessus, mais il n'est pas running.it obtenu CalledFromWrongThreadException quel est le problème INB ci-dessus code.Please me donner quelques suggestions.Thanks à l'avanceCalledFromWrongThreadException

Répondre

8

Je pense que vous ne pouvez pas faire Pour afficher les modifications d'un autre thread que le thread UI, créez handlers dans l'oncreate et publiez-y votre thread ou utilisez la méthode AsyncTask ou runOnUIThread pour envoyer des portions de code directement au thread d'interface utilisateur.

+1

Si vous voulez que vos 2 fils à exécuter l'une après l'autre, pourquoi pas poster simplement vos 2 fils au même gestionnaire ? – Sephy

+0

"En rapport avec votre question" - quelle est alors votre question? Je pensais que Sephy a donné une réponse appropriée à votre seule question dans le texte. Sois plus précis. – LordTwaroog

+0

Merci pour votre réponse Sephy, et comment nous utilisons les 2 threads dans les gestionnaires. Donnez-moi un exemple de code. – Pinki

0

J'ai édité votre code de fonction 2e, je vois que votre code est boucle pour toujours parce que le premier appel methode secondMethod et le second methode appellent le nouveau firstMethod à démarrer, puis boucle pour toujours. Je l'ai supprimé et déplacé le code mise à jour ImageView dans l'interface utilisateur de cette discussion, pourriez-vous essayer:

class ThraedDemo { 

    private void firstMethod() { 
     Thread objThread = new Thread() { 
      @Override 
      public void run() { 
       try { 
        runOnUiThread(new Runnable() { 
         public void run(){ 
          ((ImageView)findViewById(R.id.ImageViewnumber)).setImageResource(nums[n]); 
         } 
        }); 
        Thread.sleep(10000); 
        Log.v("Thread","1111111111111111sleep"); 
       } catch (InterruptedException ex) { 
        System.out.println("interuped exception" + ex.getMessage()); 
       } 
       secondMethod(); 
      } 
     }; 
     objThread.start(); 
    } 

    private void secondMethod() { 
     Thread objThread2 = new Thread() { 

      @Override 
      public void run() { 
       try { 
        runOnUiThread(new Runnable() { 
         public void run(){ 
          ((ImageView)findViewById(R.id.ImageViewnumber)).setImageResource(nums[n+1]); 
         } 
        }); 
        n++; 
        Thread.sleep(10000); 
        Log.v("Thread","22222222222 sleep"); 
       } catch (InterruptedException ex) { 
        System.out.println("interuped exception" + ex.getMessage()); 
       } 
      } 
     }; 
     objThread2.start(); 
    } 
}