如何在android中实现延迟?

时间:2014-08-21 13:28:53

标签: android delay

按下按钮时,我想每2秒打印一次序号。我使用了以下代码:

int j=0;
button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            c=Calendar.getInstance();
            Delay(2 ,c.get(Calendar.SECOND));
            if(j++<5)
              t.setText("number "+j);

            }

    });

public void Delay(int p,int q){

    int z=0;

    while(z<p){
        c=Calendar.getInstance();
        i= c.get(Calendar.SECOND);
        z=i-q;
    }

    return ;
}

但此代码打印&#34; Number 5&#34;在10秒结束时直接。 如何每隔2秒依次打印&#34; 1号&#34;,&#34; 2号&#34;,&#34; 3号和34号....

3 个答案:

答案 0 :(得分:1)

请注意,如果您在UI线程上执行此操作,则会阻止UI线程10秒钟。有一个单独的线程来做这件事要好得多:

button.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View arg0) {
        new Thread() {
            public void run() {
                for(int j=1; j<=5; i++) {
                     runOnUiThread(new Runnable() {
                         @Override
                         public void run() { t.setText("number " + j); }
                    });
                    SystemClock.sleep(2000);
                }
            }
        }.start();
    }
});

此代码启动一个新线程(因此不阻止UI),从1到5迭代输出数字(在UI线程上,因为它正在更改UI),然后睡眠2秒。

答案 1 :(得分:0)

使用Runnable发布绑定到应用程序的UI线程的处理程序,而不是睡眠或延迟。如果您在onClick()方法中睡眠或延迟,则会阻止UI线程,这会使您的UI无响应。

public class MyActivity extends Activity implements Handler.Callback {
    ...
    private Handler mHandler = new Handler(this);
    private int     mNumber = 0;
    ...
    @Override
    public void onClick(View v) {
        mNumber++;
        mHandler.postDelayed(new Runnable() {
            public void run() {
                t.setText("number: " + mNumber);
            }, 2000);
    }
}

答案 2 :(得分:0)

您可以使用CountDownTimer进行此操作..您只需要定义时间量和更新频率。你只需稍微调整逻辑就可以向上打印数字。

button.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
    new CountDownTimer(60000, 2000) {

       public void onTick(long millisUntilFinished) {
           mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
       }

       public void onFinish() {
         mTextField.setText("done!");
       }
    }.start();
}
});