2012-11-07 2 views
1

필자가 원하는 것은 ViewPager의 각 페이지마다 새로운 별도의 타이머를 만드는 것입니다. 내 현재 실현에는 모든 페이지에 대해 하나의 처리기가 포함되어 있습니다. ViewPager.OnPageChangeListener.onPageSelected()를 사용하여 새 TimerTask를 시작합니다. 그러나 응용 프로그램을 실행하는 동안 볼 수 있듯이 runnables 스택과 타이머는 모든 콜백을 제거하려고해도 모든 textviews를 한 번에 빠르고 더 업데이트합니다. 핸들러.ViewPager - 각 페이지에서 다른 타이머를 시작하는 방법은 무엇입니까?

작동 방식 : 페이지 1로 스 와이프 - 타이머 1이 시작되고 2 페이지로 스 와이프 - 타이머 1이 재설정되고 중지되고 타이머 2가 시작됩니다.

viewPager.setOnPageChangeListener(new OnPageChangeListener() { 

     public void onPageScrollStateChanged(int page) { 

     } 

     public void onPageScrolled(int position, float arg1, int arg2) { 
     } 

     public void onPageSelected(int position) { 
      View currentPage = ((QuestionPagerAdapter) viewPager.getAdapter()).get(position); 

      timerText = (TextView) currentPage.findViewById(R.id.timerText); 
      handler.removeCallbacks(doTick); 
      if (timerText != null) startTimer(); 
     } 

    }); 

Runnable를 구현 : 새 doTick의 Runnable 인스턴스를 않습니다

final Runnable doTick = new Runnable() { 

    public void run() { 
     seconds--; 
     if (seconds == -1) { 
      minutes--; 
      seconds = 59; 
     } 
     String secText = String.valueOf(seconds); 
     if (seconds < 10) secText = "0" + secText; 
     timerText.setText("0" + String.valueOf(minutes) + ":" + secText); 
     viewPager.getAdapter().notifyDataSetChanged(); 
    } 

}; 

private void startTimer() { 
    for (int i = 1; i <= seconds; i++) { 
     TimerTask task = new TimerTask() { 
      @Override 
      public void run() { 
       handler.post(doTick); 
      } 
     }; 
     timer.schedule(task, i * 1000); 
    } 
} 

답변

1

? 이 작업은 한 번만 수행해야합니다. 그렇지 않으면 doTick 인스턴스를 잃어 버리고 새로운 인스턴스로 바꾼 것처럼 모든 doTick 인스턴스와 관련된 콜백을 제거 할 수 없습니다.

는 데이터 필드가 선언하고 다음과 같이 당신에게가 startTimer 방법을 수정

private void startTimer(TextView textView) { 
    if(doTicks != null ) { 
     handler.removeCallbacks(doTick); 
     doTicks = new doTicks(textView); 
    } 
    for (int i = 1; i <= seconds; i++) { 
     TimerTask task = new TimerTask() { 
      @Override 
       public void run() { 
        handler.post(doTick); 
       } 
      }; 
     timer.schedule(task, i * 1000); 
    } 
} 

당신은 또한 그것을 업데이트해야하는 필드에 대한 참조를 제공 (듯이) 당신의 doTicks에 매개 변수를 제공해야합니다. 이 매개 변수를 startTimer에도 전달하고이 필드에 대한 참조를 doTicks의 데이터 멤버로만 활동의 데이터 멤버로 유지하지 마십시오. 따라서 진정한 정적 내부 클래스를 만들어야합니다.

+0

이제 textViews를 사용해도됩니다. 그러나 한 가지가 있습니다. 타이머 스택과 초는 페이지를 스 와이프 할 때마다 빠르며 콜백은 제거되지 않는 것 같습니다. – sonderlain

+0

각 인스턴스에서 removeCallBack을 호출 하시겠습니까? 당신의 runnable을 콘솔에 출력하면, 그들은 당신에게 "주소"를 줄 것이다 : 당신이 그것을 만들 때마다 그리고 removecallbacks를 호출 할 때마다 그것들을 출력하라. 일치해야합니다. – Snicolas

+0

고마워,하지만이 물건으로 알아 내지 못했어. android.os.CountDownTimer를 사용하여 간단하게 문제를 해결했지만 꽤 잘 맞았습니다. – sonderlain

관련 문제