0

さまざまなヨガのポーズを 60 秒間表示するアプリをやっています。カウントダウンタイマーを思い通りに機能させようと、髪を伸ばしてきました。タイマーを一時停止して、15 秒後に自動的に再起動できるようにする必要があります。一時停止がなかったため、Android の CountDownTimer は機能しませんでした。書き直した Android CountDownTimer と従来のバージョン (Android CountDownTimer) の 2 つの異なるバージョンを試しましたが、ハンドラーを使用しているため、すべて同じバグがあるようです。

私はこのバージョンを試しました: http://www.java2s.com/Open-Source/Android/Timer/multitimer-android/com/cycleindex/multitimer/CountDownTimerWithPause.java.htm

私はこのバージョンを試しました: Android: CountDownTimer は最後の onTick() をスキップします! - onFinish メソッドを追加しました。

onFinish メソッドで 15 秒間 Thread.sleep を実行しようとしていますが、Thread.sleep モードに移行する前に最後の 1 秒を過ぎても UI が更新されません。次のコードでは、TextView は、Thread.sleep 呼び出しの後まで空の文字列に設定されるように更新されません。

cdt = new CountDownTimerWithPause(60000,1000,true) { 
        @Override
        public void onTick(long millisUntiFinished) { 
            tvClock.setText("Remaining:" + millisUntiFinished/1000);

        }

        @Override
        public void onFinish() {
            tvClock.setText("");
            bell.start();
            if (bAutoPlayIsOn) { 

                tvClock.setText("waiting for next pose...");
                try {

                    //15 second pauses between poses
                    Thread.sleep(15000);
                    //start over
                    listener.onForwardItemSelected();
                    ResetClocktoMaxTime(60000);
                    resume();
                } catch (InterruptedException e) {
                    Log.d("Sleep Interrupted", e.toString());
                    e.printStackTrace();
                }
                catch (Exception e) {
                    Log.d("Timer", e.toString());
                }
            }
            else { 
              tvClock.setText("Done");
                       btnStart.setText("Start ");
              bClockIsTicking = false;
              btnStart.setCompoundDrawablesWithIntrinsicBounds(null, playBtn, null, null);
            }

        }
    };

これを行う方法(15秒後に再起動する)のアイデアはありますか?

4

1 に答える 1

1

onFinish メソッドはインターフェイス スレッドから呼び出されているため、onFinish が戻るまでインターフェイスを変更しても実際には再描画されません。次のようなことを試してください:

  cdt = new CountDownTimerWithPause(60000,1000,true) {
      @Override
      public void onTick(long millisUntiFinished) {
          tvClock.setText("Remaining:" + millisUntiFinished/1000);

      }

      @Override
      public void onFinish() {
          tvClock.setText("");
          bell.start();
          if (bAutoPlayIsOn) {

              tvClock.setText("waiting for next pose...");
              (
                new Thread() {
                    public void run() {
                        try {
                            //15 second pauses between poses
                            Thread.sleep(15000);
                            getActivity().runOnUiThread
                            (
                              new Runnable() {
                                  public void run() {
                                    //start over
                                    listener.onForwardItemSelected();
                                    ResetClocktoMaxTime(60000);
                                    resume();
                                  }
                              }
                            );
                        }
                        catch (InterruptedException e) {
                            Log.d("Sleep Interrupted", e.toString());
                            e.printStackTrace();
                        }
                        catch (Exception e) {
                            Log.d("Timer", e.toString());
                        }
                    }
                }

              ).start();

          }
          else {
            tvClock.setText("Done");
            btnStart.setText("Start ");
            bClockIsTicking = false;
            btnStart.setCompoundDrawablesWithIntrinsicBounds(null, playBtn, null, null);
          }

      }
  };   
于 2013-01-25T22:09:22.457 に答える