暂停CountDownTimer而另一个在Android Studio中运行,然后在另一个结束时恢复它?

时间:2016-10-18 18:56:58

标签: java android android-studio countdowntimer

我的程序中有两个CountDownTimers:一个4秒,一个24秒。我希望较长的计时器每隔4秒暂停一次,而较短的计时器正在运行。然后当短计时器结束时,长计时器开始倒计时。这是两个计时器的代码:

final CountDownTimer loop = new CountDownTimer(4000, 1000) {
                @Override
                public void onTick(long millisUntilFinished) {

                }
                @Override
                public void onFinish() {
                    number.setVisibility(View.GONE);
                    final TextView prompt = (TextView) findViewById(R.id.prompt);
                    prompt.setVisibility(View.VISIBLE);
                    prompt.setText(" Enter the number");
                    final EditText input = (EditText) findViewById(R.id.enterAnswer);
                    input.setVisibility(View.VISIBLE);
                    input.setOnKeyListener(new View.OnKeyListener() {
                        @Override
                        public boolean onKey(View v, int keyCode, KeyEvent event) {
                            if (event.getAction() == KeyEvent.ACTION_DOWN) {
                                switch (keyCode) {
                                    case KeyEvent.KEYCODE_ENTER:
                                        Editable answer = input.getText();
                                        int finalAnswer = Integer.parseInt(String.valueOf(answer));
                                        int finalLoadG1 = Integer.parseInt(String.valueOf(number.getText()));
                                        input.setVisibility(View.GONE);
                                        prompt.setVisibility(View.GONE);
                                        if (finalAnswer == finalLoadG1) {
                                            score++;
                                        }

                                        number.setVisibility(View.VISIBLE);
                                        int loadG1 = generateG1.nextInt(1000000)+10000;
                                        number.setText(""+loadG1);
                                        input.getText().clear();

                                        start();

                                        return true;
                                    default:
                                }
                            }
                            return false;
                        }
                    });
                }
                }.start();


            new CountDownTimer(24000, 1000) {
                @Override
                public void onTick (long millisUntilFinished) {
                }
                @Override
                public void onFinish() {
                    TextView result = (TextView) findViewById(R.id.outcome);
                    result.setText("Score: "+ score);
                    TextView prompt = (TextView) findViewById(R.id.prompt);
                    prompt.setVisibility(View.GONE);
                    final EditText input = (EditText) findViewById(R.id.enterAnswer);
                    input.setVisibility(View.GONE);
                    loop.cancel();
                    number.setVisibility(View.GONE);
                }
            }.start();

我考虑过命名更长的计时器,然后在onTick中为更短的计时器添加name.pause()。问题是,因为较长的计时器是在较短的计时器之后写的,所以它的名称在初始化之前是不可识别的。 Java按顺序读取内容,对吗?或者是所有语言?

如果有人能帮助我,我会感激不尽,非常感谢。

1 个答案:

答案 0 :(得分:0)

import java.util.Vector;

class LongTimer extends Thread {

    static final int MAXQUEUE = 5;
    private Vector messages = new Vector();

        @Override
        public void run() {
            try {
                while (true) {
                    putMessage();
                    sleep(4000);
                }
            } catch (InterruptedException e) {
            }
        }

        private synchronized void putMessage() throws InterruptedException {
            while (messages.size() == MAXQUEUE) {
                wait();
            }
            messages.addElement(new java.util.Date().toString());
            System.out.println("put message");
            notify();
            //Later, when the necessary event happens, the thread that is running it calls notify() from a block synchronized on the same object.
        }

        // Called by short timer
        public synchronized String getMessage() throws InterruptedException {
            notify();
            while (messages.size() == 0) {
                wait();//By executing wait() from a synchronized block, a thread gives up its hold on the lock and goes to sleep.
            }
            String message = (String) messages.firstElement();
            messages.removeElement(message);
            return message;
        }
    }

    class ShortTimer extends Thread {

        LongTimer producer;

        ShortTimer(LongTimer p) {
            producer = p;
        }

        @Override
        public void run() {
            try {
                while (true) {
                    String message = producer.getMessage();
                    System.out.println("Got message: " + message);
                    //sleep(200);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        public static void main(String args[]) {
            LongTimer producer = new LongTimer();
            producer.start();
            new ShortTimer(producer).start();
        }        
    }