当前位置: 首页 > 面试题库 >

计时器的Android线程

易风华
2023-03-14
问题内容
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中Thread的代码,但是不起作用。你能帮助我吗?

它的计时器从5分钟倒数到0:00。


问题答案:

在你的情况下,你正在使用线程。因此,你无法从ui线程以外的其他线程更新ui。所以你用runOnUithread。我建议你使用倒数计时器或处理程序。

1.CountDownTimer

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

这是另一个示例的链接。建议你检查倒计时计时器的链接。

倒数计时器,以分钟和秒为单位

例:

 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

范例:

  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应用程序,每10分钟录制一次音频。我用定时器来做这件事。但是scheduleAtFixedRate和scheduleAtFixedRate之间有什么区别呢?使用其中一种方法是否有性能优势?

  • 我使用Timer和TimerTask为聊天应用程序长轮询新消息。我想研究两种“稍微”不同的可能性: 1:计时器声明为局部变量 *问题:每次调用该方法时,我都会看到创建了一个新线程,[Timer-1]、[Timer-2]等等。。在Eclipse调试窗口中,即使在getLastMessages(..)之后,它们似乎都在运行完成运行并向客户端返回值。如果计时器实际使用线程,并且在几次事务之后,服务器最终

  • 我有一个简单的程序,有一个TextView和两个按钮:Button1和Button2。 单击按钮1将启动一个计数器,每1秒增加1并在TextView上显示结果;点击按钮2将停止它。这是我为Button1编写的代码的一部分。但它不起作用。 我知道有一些关于使用线程的类似问题,但似乎他们没有提到停止计数器。 非常感谢您的任何建议。 补充: 你好,我刚刚将我的代码从一个更大的程序缩短到这个,但它仍然崩溃

  • 本文向大家介绍Android倒计时神器(CountDownTimer),包括了Android倒计时神器(CountDownTimer)的使用技巧和注意事项,需要的朋友参考一下 Android倒计时神器 - CountDownTimer,供大家参考,具体内容如下 啥是CountDownTimer?​ CountDownTimer是Andorid.os包下一个谷歌为我们封装好的一个倒计时工具。我们吗、

  • 问题内容: 我正在尝试每1分钟显示一次味精!不停!我发现一个示例,它在固定延迟后仅显示一次味精!你能帮忙设置吗?或者如果使用计时器更好,我需要一个例子!! 谢谢! 问题答案: 试试这个代码-

  • 我有一个应用程序,有两个定时器开始他们的按钮点击。 当它们开始时,计时器倒计时显示在文本视图中,因此用户可以看到倒计时(10,9,8,7等) 一个计数器是45秒计时器,另一个是30秒计时器。我注意到,当计时器启动时,它们会以两种方式之一运行:计时器倒计时显示从正确的时间开始的秒数(然后跳过一个)45、43、42、41等,或者其他时间不显示开始值,直接跳到(44、43、42、41等),并且不会跳过任