2016-07-07 161 views
0

我正在開發Android應用程序,我有一個要求:倒計時時間的Android

1)倒計時時間從'x' minutes'1' minute,然後一旦在1 minute,在60 sec, 30 sec條款,然後0計數。

我按照1分鐘倒計時(60000)。

我的代碼是:

public void countdowntimer(long timeinmillis, long countdowninterval){ 
     Log.d("hi","Iamhere 0" + timeinmillis/60000); 
     new CountDownTimer(timeinmillis, countdowninterval) { 

      public void onTick(long timeinmillis) { 


       //Countdown the time in terms of minutes 

       Log.d("hi","Iamhere 2" + timeinmillis); 
       tv.setText(String.valueOf((timeinmillis)/60000) + "min"); 
       rootView.invalidate(); 
       if(timeinmillis <= 60000 && timeinmillis > 30000){ 
        tv.setText(String.valueOf(60) + "sec"); 
        rootView.invalidate(); 
       }else if(timeinmillis < 30000){ 
        tv.setText(String.valueOf(30) + "sec"); 
        rootView.invalidate(); 
       } 
      } 

      public void onFinish() { 

      } 
     }.start(); 
    } 

日誌是:

Iamhere0 4 

Iamhere1 3 

爲什麼我的第二個日誌顯示我實現60秒1分鐘比第一日誌以及如何較小,30秒倒計時,一旦它在1分鐘?

的預期結果是:

4 min 

3 min 

2 min 

1 min -> 60sec 

30sec 

0 
+0

如果您包含預期的輸出,您應該收到更高質量的答案 – Mfusiki

+0

僅僅因爲onTick已經減去第一個區間值...對於該格式,只需使用檢查剩餘時間是否低於... – AxelH

+0

仍然不工作..請參閱編輯代碼 – Mark023

回答

-1

使用AtomicInteger保持線程狀態

在第一條件其顯示時間在分鐘

if (min.get() > 1) { 
         mCount.setText(Integer.toString(min.get())+" min"); 
         handler.postDelayed(this, 1000); 
         min.getAndDecrement(); 
        } 

AND

在最後一分鐘其前進到第二狀態中秒,這顯示時間

else { 

        if(min.get()== 1) { 
         mCount.setText("60 Sec"); 
         handler.postDelayed(this, 500); 
        } 
        else if(min.get() == 0){ 
         mCount.setText("30 Sec"); 
         handler.postDelayed(this, 500); 
        } 
        else 
         mCount.setText("0 Sec"); 
         min.getAndDecrement(); 
       } 

使用...........

final TextView mCount = (TextView) findViewById(R.id.count); 
     final Handler handler = new Handler(); 
     final AtomicInteger min = new AtomicInteger(4); 
     final Runnable counter = new Runnable() { 
      @Override 
      public void run() { 

       if (min.get() > 1) { 
        mCount.setText(Integer.toString(min.get())+" min"); 
        handler.postDelayed(this, 1000); 
        min.getAndDecrement(); 
       } else { 

        if(min.get()== 1) { 
         mCount.setText("60 Sec"); 
         handler.postDelayed(this, 500); 
        } 
        else if(min.get() == 0){ 
         mCount.setText("30 Sec"); 
         handler.postDelayed(this, 500); 
        } 
        else 
         mCount.setText("0 Sec"); 
         min.getAndDecrement(); 
       } 

      } 
     }; 
     handler.postDelayed(counter, 0); 

喜歡編碼.....

+0

謝謝你的代碼...所以我的倒計時間隔是60000ms。那麼我在哪裏使用這個 – Mark023

+0

刪除倒計時的所有代碼,並使用此代碼........ – sushildlh

+0

好吧,但在這段代碼我不明白你指定分鐘的開始時間。假設我需要從4分鐘開始計數,這4分鐘您指定的位置是 – Mark023

0

嘗試這樣的:

public class MyTimeCount extends CountDownTimer { 
private Button btn_code; 

public MyTimeCount(long millisInFuture, long countDownInterval,Button btn) { 
    super(millisInFuture, countDownInterval); 
    btn_code=btn; 
} 

@Override 
public void onFinish() { 
    btn_code.setText("Reacquire"); 
    btn_code.setEnabled(true); 
} 
@Override 
public void onTick(long millisUntilFinished){ 
    btn_code.setEnabled(false); 
    btn_code.setText(millisUntilFinished /1000+"s"); 

} 

} 
1

我花了一些時間來回答這個問題,這是我holydays ......但這裏是一個其他如果這仍然是爲任何人進行干預的解決方案。

我更喜歡使用System.currentTimeInMilli來管理定時器。當我開始時,我計算每次打勾結束的時間,然後計算剩餘時間以顯示。

這種設計可以防止任何增量/減量變量定時器的延遲。爲了保持這個類可重用,我在每個tick上使用Observer模式(本例中爲100ms),Observable實例將發送給每個觀察者。

public class RunnableTimer extends Observable implements Runnable { 

    private final Handler handler; 
    // Number of milliseconds to run before the end 
    private Long delay; 
    // Date in millis until the end of the timer 
    private Long countDownEnd = null; 
    //The calculate remaining time 
    private long time; 

    public RunnableTimer(Observer o){ 
     this.handler = new Handler(); 
     addObserver(o); 
    } 

    /** 
    * Start the timer 
    * @param delay : the number of milliseconds to run 
    */ 
    public void start(Long delay){ 
     this.delay = delay; 

     countDownEnd = System.currentTimeMillis() + delay; 
     handler.postDelayed(this, 0); 
    } 

    @Override 
    public void run() { 
     time = countDownEnd - System.currentTimeMillis(); 

     if (time > 0) 
      handler.postDelayed(this, 100); //Recalculate every 100ms, to keep some precision... can be more or less. 
     else 
      time = 0; //to prevent to show negative values 

     sendUpdate(); 
    } 


    public String toString(){ 
     long t = time/1000; 
     Log.d("time", "" + t); 
     if(t >= 60){ 
      return String.format("%d min.", t/60); 
     } if t <= 0){ 
      return "End"; 
     } else { 
      return String.format("%d sec.", (t/30+1)*30); 
     } 
    } 

    /** 
    * Send the instance to each observer. 
    */ 
    private void sendUpdate(){ 
     setChanged(); 
     notifyObservers(toString()); 
    } 
} 

從這個,你有一個計時器,使用系統時間計算剩餘時間和toString方法,創建願望模板。

要使用它,只需使用您想要的Observer創建一個實例即可。

public class Test implements Observer { 

    private RunnableTimer timer; 

    public Test(){ 
     timer = new RunnableTimer(this); 
     timer.start(65000) //65sec 
    } 

    @Override 
    public void update(Observable observable, Object data) { 
     if(data == timer){ //If the update comes from the timer 
      Log.d("timer", timer.toString()); 
     } 
    } 
} 

我不得不清除我的班的一大部分,但這應該工作正常,因爲這是更簡單的版本。

編輯:在你的情況下,你的活動/片段應該實現觀察者,並在更新中,我記錄計時器,你應該把toString結果放到你的文本框中。