2017-09-29 12 views
0

나는 안드로이드에서 초보자입니다.일부 안드로이드에서 처리기의 논리 오류

내가 원하는 것 : 여기 서브 핸들러가 주 핸들러의 10 초마다 호출해야한다는 것을 알기 위해 노력하고 있습니다. 그리고 메인 핸들러는 20 초 동안 계속되어야합니다.

문제 : 로그를 사용했지만 작동하지 않는지 확인하려면 다음을 수행하십시오. 하위 처리기로 8 회 또는 9 회 또는 10 회 반복합니다. 논리 오류가 있습니까? 아니면 더 좋은 방법이 있습니까? 감사합니다.

내 코드 :

int i=0; 
int cont; 
final Handler handler = new Handler(); 
handler.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     i++; 
     cont = 1; 
     Log.e("main count", i + ""); 
     final Handler handler1 = new Handler(); 
     handler1.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       if (cont <= 10) { 
        Log.e("sub count ", cont + ""); 
        cont++; 
        handler1.postDelayed(this, 100); 
       } 
      } 
     }, 100); 
     if (!(i == 20)) { 
      handler.postDelayed(this, 1000); 
     } 
    } 
}, 1000); 
+0

@ pskink- 사실 앞으로는 주 처리기와 다른 하위 처리기에서 서로 다른 메서드를 호출하려고합니다. – Chirag

+0

왜 여러 처리기가 필요합니까? – JimmyB

+0

@ jimmyB-y 메서드가 여러 번 호출되고 main 처리기에서 x 메서드가 한 번 호출되는 문제를 원합니다. – Chirag

답변

0

그것은 당신이 시간을 직접 측정하기 때문에 핸들러를 사용하여 정확한 타이밍으로 코드를 실행하기는 어렵습니다. ScheduledThreadPoolExecutor 또는 Timer과 같은 내장 클래스를 사용하는 것이 훨씬 쉽습니다. 나는 코드에 대한 변경이 거의 필요 없으므로 첫 번째를 권하고 싶다. 요구 사항에 따라 scheduleAtFixedRate() 또는 scheduleWithFixedDelay() 메소드 중 하나를 선택해야합니다.

final ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(2); 
final ScheduledFuture mainFuture = executor.scheduleWithFixedDelay(new Runnable() { 
    public void run() { 
     if (i < 20) { 
      Log.e("main count ", i + ""); 
      i++; 
     } else { 
      mainFuture.cancel(true);// stop after 20 executions 
     }   
}, 
0, /*initial wait time*/ 
1, /* time between consecutive runs */ 
TimeUnit.SECONDS); 

final ScheduledFuture subFuture = executor.scheduleWithFixedDelay(new Runnable() { 
    public void run() { 
     if (cont < 20 * 10) { 
      Log.e("sub count ", cont + ""); 
      cont++; 
     } else { 
      subFuture.cancel(true);// stop after 200 executions 
      executor.shutdown(); 
     }   
}, 
100, /*adjust this according to the desired sequencing of the count tasks */ 
100, /* time between consecutive runs */ 
TimeUnit.MILLISECONDS); 

하위 일정 코드를 실행할 때마다 하나의 ScheduledFuture를 사용하고 주 개수 코드를 실행할 수도 있습니다.