0

虽然必须有更好的策略来完成我在我的应用程序中设置的倒计时,但我似乎很清楚Thread.sleep(1000)在每个数字之间使用是可行的。它没有,我仍然没有任何其他解决方案。当我运行应用程序时,倒计时从 5 秒变为 1 秒。

这是我的代码:

bBegin.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

           bBegin.setText("5");

            try{
                Thread.sleep(1000);
            }catch(InterruptedException ie){

            }


            bBegin.setText("4");

            try{
                Thread.sleep(1000);
            }catch(InterruptedException ie){

            }

            bBegin.setText("3");

            try{
                Thread.sleep(1000);
            }catch(InterruptedException ie){

            }

            bBegin.setText("2");

            try{
                Thread.sleep(1000);
            }catch(InterruptedException ie){

            }

            bBegin.setText("1");

            try{
                Thread.sleep(1000);
            }catch(InterruptedException ie){

            }
}

谢谢,我希望这个问题能帮助像我这样的其他菜鸟(不用担心,我确实检查了该网站以获取以前的解决方案)

4

3 回答 3

3

Thread.sleep(1000); 坏的!sleep()您正在调用UI thread您几乎(如果有的话)永远不想做的事情。会UI睡那段时间。改为使用CountDownTimer

倒计时文档

当然还有其他方法,但这个方法应该可以很好地完成你想要的。

例子

在你的情况下,你可能会使用这样的CountDownTimer东西。

创建内部类

private class MyCountDown extends CountDownTimer
{
    long duration, interval;
    public MyCountDown(long millisInFuture, long countDownInterval) 
   {
        super(millisInFuture, countDownInterval);
        duration = millisInFuture;
        interval = countDownInterval;
        int secs = 5;  // varaible for counter to be placed in TextView
        start();
    }

           @Override
    public void onTick(long duration) 
   {
        bBegin.setText(String.valueOf(secs));           
        secs = secs - 1;            
    }

    @Override
    public void onFinish() {
        secs = 5; // reset counter if needed or do anything else you need when countdown is over
    }

onClick()并像这样称呼它

MyCountDown timer = new MyCountDown(5000, 1000);  // local variable but might want to make it a member variable
于 2013-09-13T00:36:55.797 回答
2

Sleep 不会“跳过”任何内容 - 相反,此代码会阻止 UI 更新,直到方法结束(在它全部休眠 5 次之后)。

在 onClick 方法结束后的某个时刻——UI 调度可以恢复操作——UI 会更新。当此更新发生时,显示将更新为分配的最后一个值,这会导致错误的结论是代码被“跳过”。但是,该方法中的所有代码都运行了.

这就引出了一条非常重要的规则:不要在主 UI 线程上休眠。这样做会阻止用户交互并阻止显示更新,因为它会阻止UI 事件/调度队列。所有标准 UI 回调,例如点击侦听器,都发生UI 线程上。

在需要睡眠地方——比如在游戏和自定义画布的情况下——睡眠是在不同的(非 UI)线程上完成的,因此它不会导致这种主要的 UI 阻塞行为。

于 2013-09-13T00:36:00.040 回答
0
**As in the attached code snippet it is showing user thread is trying to update UI Thread.which is not a good practice..
i have done same using the concept of Handler.
the code snipper is ..**


public class MainActivity extends Activity {
    TextView tv;
    Button b1;
    Handler handler;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv=(TextView) findViewById(R.id.textView1);
        b1=(Button) findViewById(R.id.button1);
        handler= new Handler();


        b1.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {

                Runnable r=new Runnable() {
                    int   mynumber=5;
                    @Override
                    public void run() {
                        while(mynumber >0){
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            handler.post(new Runnable() {
                                public void run() {
                                    tv.setText("remaining time  is "+mynumber );
                                }
                            });

                            mynumber--;
                        }
                    }
                };

                new Thread(r).start();
            }
        });


    }

}
于 2013-09-13T02:42:17.017 回答