2013-07-24 5 views
3
public class MainActivity extends Activity 
{ 
int min, sec; 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    min = 5; 
    sec = 0; 
    final TextView timer1 = (TextView) findViewById(R.id.timer1); 
    timer1.setText(min + ":" + sec); 
    Thread t = new Thread() { 
     public void run() { 
       sec-=1; 
       if (sec<0) { 
        min-=1; 
        sec=59; 
       } 
       timer1.setText(min + ":" + sec); 
       try 
       { 
        sleep(1000); 
       } 
       catch (InterruptedException e) 
       {} 
      } 
    }; 
    t.start(); 
} 
} 

Ceci est un code pour un Thread en Java mais cela ne fonctionne pas. Pouvez-vous m'aider?Thread Android pour une minuterie

C'est un minuteur qui compte à rebours de 5 minutes à 0:00.

+1

Ne pensez-vous de la minuterie est un meilleur choix? http://developer.android.com/reference/java/util/Timer.html – Shrikant

+0

avez-vous essayé l'une des solutions affichées? – Raghunandan

Répondre

4

Vous essayez de mettre à jour le UI Thread d'un arrière-plan Thread avec

timer1.setText(

que vous ne pouvez pas le faire. Vous devez utiliser runOnUiThread(), AsyncTask, CountDownTimer ou quelque chose de similaire.

See this answer pour un exemple de runOnUiThread()

Mais CountDownTimer est agréable pour des choses comme ça.

En outre, lors de la publication d'une question sur SO, des déclarations comme "cela ne fonctionne pas". sont très vagues et souvent inutiles. S'il vous plaît indiquer les résultats attendus par rapport aux résultats réels de votre code et logcat si l'application plante.

+0

@Raghunandan Bon point! +1 pour la rigueur ... J'ai eu des liens paresseux et des liens postés;) – codeMagic

5

Dans votre cas, vous utilisez des unités d'exécution. Vous ne pouvez donc pas mettre à jour l'interface utilisateur du thread autre que le thread ui. Donc, vous utilisez runOnUithread. Je vous suggère d'utiliser un compte à rebours ou un gestionnaire.

1.CountDownTimer

http://developer.android.com/reference/android/os/CountDownTimer.html

Voici un lien vers un autre exemple. Je vous suggère de vérifier le lien pour le compte à rebours.

Countdowntimer in minutes and seconds

Exemple:

public class MainActivity extends Activity { 

Button b; 
TextView tv; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    tv = (TextView) findViewById(R.id.textView1); 
    b= (Button) findViewById(R.id.button1); 
    b.setOnClickListener(new OnClickListener() 
    { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      startTimer(200000); 
     } 

    }); 
} 
private void startTimer(long time){ 
    CountDownTimer counter = new CountDownTimer(30000, 1000){ 
     public void onTick(long millisUntilDone){ 

      Log.d("counter_label", "Counter text should be changed"); 
      tv.setText("You have " + millisUntilDone + "ms");      
     } 

     public void onFinish() { 
      tv.setText("DONE!"); 

     } 
    }.start(); 
} 
} 

2.You peut utiliser un Handler

Exemple:

Handler m_handler; 
Runnable m_handlerTask ; 
int timeleft=100; 
m_handler = new Handler(); 
m_handlerTask = new Runnable() 
{ 
@Override 
public void run() { 
if(timeleft>=0) 
{ 
    // do stuff 
    Log.i("timeleft",""+timeleft); 
    timeleft--; 
}  
else 
{ 
    m_handler.removeCallbacks(m_handlerTask); // cancel run 
} 
    m_handler.postDelayed(m_handlerTask, 1000); 
} 
}; 
m_handlerTask.run();  

3.Timer

La minuterie fonctionne sur un fil différent. Vous devriez mettre à jour ui sur le thread ui. utiliser runOnUiThread

Exemple:

int timeleft=100; 
    Timer _t = new Timer(); 
    _t.scheduleAtFixedRate(new TimerTask() { 
      @Override 
      public void run() { 

       runOnUiThread(new Runnable() //run on ui thread 
       { 
        public void run() 
        { 
        Log.i("timeleft",""+timeleft); 
        //update ui 

        } 
       }); 
       if(timeleft>==0) 
       { 
       timeleft--; 
       } 
       else 
       { 
       _t.cancel(); 
       } 
      } 
     }, 1000, 1000);