2012-05-02 4 views
1

나는 연속적인 실행을 위해 TimerTask를 예약하는 Timer를 가지고있다. 얼마나 많은 시간이 걸릴지 모르겠다. 사용자가 클릭 할 때 타이머가 멈추고 다른 타이머는 다시 실행됩니다. 모든 것이 멈출 때까지 작동합니다. 일정을 다시 잡으면 타이머가 취소되었거나 이미 예약되었다는 예외가 발생합니다. 어떻게 멈추게하고 다시 실행합니까? 내가 생각할 수있는 모든 것을 시도했지만 여전히 작동하지 않습니다.안드로이드에서 타이머 일정 조정

 Timer myTimer; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    cameraTimedTask = new camera(this); 

     myTimer = new Timer("cameraTimer"); 

     Button b=(Button)findViewById(R.id.b); 
     b.setOnClickListener(new OnClickListener(){ 
      public void onClick(View v) { 
       myTimer.purge(); 
       myTimer.scheduleAtFixedRate(cameraTimedTask, 1000, 5000); 
      } 
     }); 

     Button bb=(Button)findViewById(R.id.button); 
     bb.setOnClickListener(new OnClickListener(){ 
      public void onClick(View v) { 
       myTimer.cancel(); 
       myTimer.purge(); 
       myTimer = null; 
       myTimer = new Timer("camerasTimer"); 
       Log.i("Check","[main]"+" timer stopped"); 
      } 
     }); 

    } 

답변

2

당신은 TimerTask를 다시 예약 할 수 없습니다

이 내가 노력하고있어 최신 코드입니다. 매번 새로운 것이 필요합니다. 또한, Handlers 및 postDelayed를 사용하는 것이 안드로이드에서 권장됩니다.

+0

흠,하지만 어떻게 처리기에서 반복적 인 작업을 예약 할 수 있습니까? 그것은 단지 작업을 지연 시키며, 마지막 작업을 마친 후 새로운 작업을 실행하는 시간을 설정하지 않습니다. – user1347945

+0

그들은 대개 작업 자체에서 handler.postDelayed()를 다시 호출합니다. 이주기적인 작업을 취소하기 위해서 그들은 handler.removeCallbacksAndMessages를 호출합니다. –

+0

hmmmm, ok 그러면 제가 생각하기에, 작업 자체가 handler.postDelay()를 호출하기 전에 그냥 끝내지 않을 것입니다. 좋은 디자인인가요? – user1347945

0

당신을위한 완벽한 솔루션 당신이 게시 된 콜백을 제거하고 실행을 위해 일정을 변경해야 할 당신의 multirepeating 코드에 처리기를 다음

private Runnable runnable; 
private Handler handler; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    handler = new Handler(); 
    runnable = new Runnable() { 

    @Override 
    public void run() { 
      // run code delayed code in here once 
    } 
}; 

을 사용하는 것입니다. 내 의견

handler.removeCallbacks(runnable); 
handler.postDelayed(runnable, 200); 
1

, 카운트 다운 타이머 대신 타이머를 사용하려고

빠른 사용 :

new CountDownTimer(30000, 1000) { 

public void onTick(long millisUntilFinished) { 
    mTextField.setText("seconds remaining: " + millisUntilFinished/1000); 
} 

public void onFinish() { 
    mTextField.setText("done!"); 
} 
}.start(); 

또는 더 복잡한 무언가를 원하는 경우 :

public class MyCountDownTimer extends CountDownTimer { 
    public MyCountDownTimer(long startTime, long interval) { 
    super(startTime, interval); 

    } 
    @Override 
    public void onFinish() { 
    text.setText("Time's up!"); 
    } 

    @Override 
public void onTick(long millisUntilFinished) { 
text.setText("" + millisUntilFinished/1000); 

} 

} 
관련 문제