2015-01-26 5 views
4

내 Java (Android) 프로그램에서 매 2 초마다 10 분 이상 연속해서 난수를 생성하고 싶습니다. 그러나 나는 전체 프로그램이 아니라 오직 한 가지 방법으로 코드의 실행을 일시 정지/지연시키고 싶다.메소드 Java에서 코드 실행 지연

I는 다음과 같이 스레드를 사용하여 시도 -

boolean stop = false; 
int random_number = 0; 

while(true){ 
    if(stop){ //if stop becomes true, then 
     return; //terminate the method 
    } 

    random_number = Math.random(); //generate random number 
            //which is used bu some other 
            //part of code 
    try { 
     Thread.sleep(2000);  //delay the code for 2 secs 
    } catch(InterruptedException ex) { //and handle the exceptions 
     Thread.currentThread().interrupt(); 
    } 
} 

그러나, 이것은 단지 방법 내부 코드의 실행을 중지하고 내 전체 화면이 비어있게 대신 전체 프로그램의 실행을 중지 Thread.sleep대로 작동하지 않습니다.

또한 Handler을 사용해 보았지만 내 방법에서 코드 실행을 멈추지 않고 대신 스택만으로 작동하지 않았습니다.

while(true){ 
    final Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      System.out.println("After 2 secs"); //this gets printed 
               //later 
     } 
    }, 2000); 
    System.out.println("Before 2 secs"); //this gets printed first 
} 

그래서 코드가 루프 동안 사용에 동등한 만드는 스택까지하고 매우 느린 만들기 -

이 더 나은의 작업을 시연 할 예정이다.

또한 Android 용 앱을 개발 중이므로 Java SE 6에서 실행 중이므로 scheduleAtFixedRate을 사용할 수 없습니다. 내가 이것을 성취 할 수있는 다른 방법이 있습니까?

고맙습니다.

+1

왜 스레드 대신 타이머를 구현하지 않습니까? – Stultuske

+1

또한,'Thread.sleep (n)'을 사용하고 싶다면 새로운 Thread에서 메소드를 실행해야한다. UI를 멈추게 만든 UI 쓰레드에서 실행했을 것이다. Timer는 @Stultuske가 제안한대로 좋은 생각입니다. – kamituel

+0

확인. 나 해보자. 고마워. – Confuse

답변

5

옵션 1 :

new Thread(new Runnable() { 
    // some code here ... 

    // This might be in a loop. 
    try { 
    Thread.sleep(2000); 
    } catch(InterruptedException ex) { 
    // Handle ... 
    } 
} 
}).start(); 
: 스레드를 사용
, 당신은 스레드 주 (UI) 해제 작업을 실행할 수 있습니다

그런 다음이 새 스레드에서 UI를 수정하려는 경우 (예 : 표시/숨기기 단추, 화면에 무언가 표시 등) UI 스레드를 통해서만이를 수정할 수 있으므로 UI ​​스레드를 통해 전달해야합니다. 이 경우 Activity.runOnUiThread()을 사용하는 것이 좋습니다.

옵션 2 : 또 다른 안드로이드 스타일의 방법은 AsyncTask을 사용하는 것입니다. UI 스레드에서 작업을 수행하는 데 사용할 수있는 세 가지 콜백을 포함합니다.

private class MyTask extends AsyncTask<Void, Void, Void> { 
    protected Void doInBackground(Void... param) { 
    // This method is running off the UI thread. 
    // Safe to stop execution here. 

    return null; 
    } 

    protected void onProgressUpdate(Void... progress) { 
    // This methid is running on the UI thread. 
    // Do not stop thread here, but safe to modify the UI. 
    } 

    protected void onPostExecute(Long result) { 
    // Also on UI thread, executed once doInBackground() 
    // finishes. 
    } 
} 

옵션 3 : @Stultuske에 의해 제안 그런 다음,도 Timer이 같은 코드의 스케치처럼 보일 수 있습니다. 덜 유연한 AsyncTask지만, 당신을 위해 간격을 처리합니다.

+0

답변 해 주셔서 감사합니다. – Confuse

2

당신이 스레드를 사용하려는 경우,이처럼 수행

Thread t = new Thread(){ 
    public void run(){ 
     while(true){ 
     if(stop) break; 
     random_number = Math.random(); 
     sleep(2000); 
     } 
    } 
}; 
t.start(); 
+0

무엇이'stop'입니까? 게다가 영원히 깨지기보다는 while 루프를 멈추어야합니다. – Doomsknight

+1

변수. 그것은 부울 atribut 있습니다. 질문을보세요 –

+0

아 맞습니다. 확실히 while (! stop)이어야합니다. 나머지는 낭비입니다. 스레드를 멈추려는 욕구 인'return '을 바 꾸었습니다.'break'로 바꾸면 멍청하게 반복됩니다. – Doomsknight

4
private Timer timer; 
timer = new Timer(); 
timer.scheduleAtFixedRate(new TimerTask() { 
      @Override 
      public void run() { 
       //Generate number 
      } 
     }, 2000, 2000); 

//Documentation (From SDK) 
/** 
      * Schedule a task for repeated fixed-rate execution after a specific delay 
      * has passed. 
      * 
      * @param task 
      *   the task to schedule. 
      * @param delay 
      *   amount of time in milliseconds before first execution. 
      * @param period 
      *   amount of time in milliseconds between subsequent executions. 
    public void scheduleAtFixedRate(TimerTask task, long delay, long period) { 
       if (delay < 0 || period <= 0) { 
        throw new IllegalArgumentException(); 
       } 
       scheduleImpl(task, delay, period, true); 
    } 

당신이 당신의 필요에 따라 그것을

timer.cancel() 
4

을 중지 할 때, 당신은 아직도 당신이 핸들러와 함께 무엇을 추구 수행 할 수 있습니다.

while 루프에서 핸들러를 만들거나 시작하지 않아도됩니다. (루프 자체를 멈추지 않는 한 쌓아 봤지만 말도 안됩니다.)

핸들러를 생성하고 Runnable 인스턴스가 지연되도록 게시하도록 알려주십시오. 맨 끝에있는 Runnable에서 조건을 확인하십시오.그래도 괜찮 으면 다른 실행 가능한 실행 파일을 지연 시키십시오. 그렇지 않으면 아무 것도하지 않고 처리기가 더 이상 실행을하지 않게됩니다.

final Handler handler = new Handler(); 
Runnable runnable = new Runnable() { 

    @Override 
    public void run() { 
     System.out.println("After 2 secs"); 
     random_number = Math.random(); 

     if (!stop) // should not be stopped, so we add another runnable; 
     { 
      handler.postDelayed(this, 2000); 
     } 
    } 

handler.postDelayed(runnable, 2000); 

유일한 단점은 장치가 잠시 동안 사용하지 않을 경우 처리기가 다시 한 번 장치 화면이 켜져 부분부터 계산을 시작합니다 의미 동결 할 수 있다는 것입니다.

올바른 작업 1 분처럼 할 수 있으며 장치가 절전 모드로 전환 될 때 1.4 초에 차단하고 다시 켜면 나머지 0.6 초를 처리합니다.

여전히 사용자의 요구 사항을 알지 못해도이 동작에 영향을받지 않을 수 있으며 답변이 적합 할 수 있습니다.