2016-10-18 9 views
-2

私は自分のプログラムに2つのCountDownTimerを持っています:4秒と24秒です。短いタイマーが動作している4秒ごとに長いタイマーを一時停止したい。その後、短いタイマーが終了すると、長いタイマーがカウントダウンを開始します。ここでは、2つのタイマーのためのコードは次のとおりです。CountDownTimerを一時停止し、もう1つはAndroid Studioで実行していて、もう1つが終了したら再開しますか?

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

先日、同じ質問を投稿したようです。 – HelloSadness

+0

私はちょうどあなたの質問に "洪水"のポイントがないと言っています。 – HelloSadness

+0

@Anto 2が洪水だと思うなら、あなたはスパムボットを読むべきです。私はあなたの要点を理解していますが、私は答えが必要ですが、どんなに役に立たなくてもただちに投稿するので、私の質問は通常無視されます。このサイトのアルゴリズムになるようにしてください。何人もの熟練したプログラマーがここにいるにもかかわらず、私の質問はちょうど再び無視されるかもしれません。 – User44

答えて

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(); 
     }   
    } 
+1

このコードスニペットは問題を解決するかもしれませんが、[説明を含む](// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)本当にあなたの投稿の質を向上させるのに役立ちます。将来読者の質問に答えていることを覚えておいてください。そうした人々はあなたのコード提案の理由を知らないかもしれません。あなたのコードに説明的なコメントを詰め込まないようにしてください。これは、コードと説明の両方の可読性を低下させます! – gunr2171

+1

ヘルプセンターで[編集ヘルプ](// stackoverflow.com/editing-help)を読んでください。スタックオーバーフローでの書式設定は、他のサイトとは異なります。 – gunr2171

関連する問題