定时器的Android线程 [英] Android Thread for a timer
问题描述
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 中线程的代码,但它不起作用.你能帮我吗?
This is a code for a Thread in Java but it doesn't work. Can you help me?
这是一个从 5 分钟倒计时到 0:00 的计时器.
Its a Timer that counts down from 5 Minutes to 0:00.
推荐答案
在您的情况下,您使用的是线程.所以你不能从 ui 线程以外的线程更新 ui.所以你使用 runOnUithread
.我建议您使用倒数计时器或处理程序.
In your case you are using threads. So you cannot update ui from the thread other than the ui thread. SO you use runOnUithread
. I would suggest you to use a countdown timer or a Handler.
1.倒计时
http://developer.android.com/reference/android/os/CountDownTimer.html
这是另一个示例的链接.建议您查看倒计时链接.
Here's a link to another example. Suggest you to check the link for the count down timer.
示例:
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.你可以使用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.定时器
计时器在不同的线程上运行.您应该在 ui 线程上更新 ui.使用 runOnUiThread
Timer runs on a different thread. You should update ui on the ui thread. use 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 );
这篇关于定时器的Android线程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!