2010-08-05 10 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(); 
     } 

    } 

Io uso il codice di cui sopra, ma non è running.it ottenuto CalledFromWrongThreadException qual è il problema di cui sopra inb code.Please Dammi un po 'in anticipo suggestions.ThanksCalledFromWrongThreadException

risposta

8

Penso che non si può fare visualizzare le modifiche da un altro thread rispetto al thread dell'interfaccia utente, quindi creare handlers nel file oncreate e pubblicare il thread su di esso oppure utilizzare il metodo AsyncTask o runOnUIThread per inviare porzioni di codice direttamente al thread dell'interfaccia utente.

+1

Se si desidera che i 2 thread da eseguire uno dopo l'altro, perché non è sufficiente inviare i tuoi 2 thread per lo stesso gestore ? – Sephy

+0

"Relativo alla tua domanda" - qual è la tua domanda allora? Ho pensato che Sephy avesse dato una risposta appropriata alla tua unica domanda nel testo. Sii più preciso. – LordTwaroog

+0

Grazie per la tua risposta Sephy, e come usiamo i 2 thread nei gestori. Dammi un po 'di codice di esempio. – Pinki

0

Ho modificato il tuo codice di 2a funzione, vedo che il tuo codice è loop per sempre causa la chiamata firstMethod secondMethod e la secondaMethod chiamano il nuovo firstMethod per avviarlo e quindi per sempre. Ho rimosso e trasferito l'aggiornamento ImageView codice nel thread UI, si potrebbe provare questo:

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(); 
    } 
}