2013-07-24 2 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(); 
} 
} 

Это код для темы на Java, но это не работает. Вы можете мне помочь?Android Тема для таймера

Его таймер, отсчитывающий от 5 минут до 0:00.

+1

Не вы думаете, таймер будет лучшим выбором? http://developer.android.com/reference/java/util/Timer.html – Shrikant

+0

Вы пробовали какие-либо решения? – Raghunandan

ответ

4

Вы пытаетесь обновить UI Thread от фона Thread с

timer1.setText(

, которые вы не можете сделать. Вам необходимо использовать runOnUiThread(), AsyncTask, CountDownTimer или что-то подобное.

See this answer для примера runOnUiThread()

Но CountDownTimer хорошо для таких вещей.

Кроме того, при размещении вопроса на SO заявления типа «это не работает». очень расплывчаты и часто бесполезны. Просьба указать ожидаемые результаты по сравнению с фактическими результатами вашего кода и logcat, если приложение рушится.

+0

@ Raghunandan Хорошая точка! +1 за тщательность ... У меня ленивые и размещенные ссылки;) – codeMagic

5

В вашем случае вы используете темы. Таким образом, вы не можете обновлять ui из потока, отличного от потока ui. Итак, вы используете runOnUithread. Я предлагаю вам использовать таймер обратного отсчета или обработчик.

1.CountDownTimer

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

Вот ссылка на другой пример. Предложите вам проверить ссылку на таймер обратного отсчета.

Countdowntimer in minutes and seconds

Пример:

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 может использовать Handler

Пример:

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

Таймер работает по другой теме. Вы должны обновить ui в потоке ui. использовать runOnUiThread

Пример:

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); 
Смежные вопросы