2012-11-07 24 views
1

我只需要爲ViewPager中的每個頁面創建新的單獨計時器。 我目前的實現包含所有頁面的一個處理程序。我使用ViewPager.OnPageChangeListener.onPageSelected()啓動新的TimerTask,但正如我在應用程序工作期間看到的,runnables堆棧和計時器變得越來越快,一次更新所有文本瀏覽,即使我試圖刪除所有的回調處理程序。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接口實現:

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 Runnable的?這應該只進行一次,否則,您將無法刪除與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 Runnable接口給它有更新字段的引用。將此參數也傳遞給startTimer,並且不要將此字段的引用作爲活動的數據成員,只作爲doTicks的數據成員(因此您需要創建一個真正的靜態內部類)。

+0

現在可以使用textViews了。但是有一件事 - 每當我滑過頁面時,定時器堆棧和秒數都會變得更快,回調似乎不會被刪除。 – sonderlain

+0

你確定你在每個實例上調用removeCallBack嗎?在控制檯中輸出你的runnable,他們會給你他們的「地址」:每次你創建一個時打印它們,每次你調用removecallbacks。他們應該匹配。 – Snicolas

+0

非常感謝,但我還沒有想出這個東西。 我簡單地使用android.os.CountDownTimer解決了我的問題,它非常適合。 – sonderlain

相關問題