2012-10-29 34 views
0

我想獲得一段代碼來定期運行。
這裏是我的代碼:用Handler.postDelayed運行多個Runnables

int endTime = 52; 
final double[] weights = new double[endTime]; 
for (int j = 0; j < endTime; j++) { 
    final int k = j; 
    newWeight = i.integrate(getCarbs(), getProt(), getFat(), newWeight, 
      height, age, PAL, gender, 7); 
    double percentChange = (newWeight - weight); 
    percentChange = percentChange * 100/weight; 
    if(percentChange <-100){ 
     percentChange = -100; 
    } 
    weights[j] = percentChange; 
    final DecimalFormat twoDForm = new DecimalFormat("0.00"); 
    final Handler h = new Handler(); 
    int time = 300*(j); 
    Runnable r = new Runnable() { 
     public void run() { 
      ((TextView) findViewById(R.id.weightGainNumbers)) 
        .setText("Week:\t" + (k + 1) + "\nWeight Change:\t" 
         + twoDForm.format(weights[k]) + "%"); 
      animate(weights[Math.abs(k - 1)], weights[k], false); 
     } 
    }; 
    h.postDelayed(r, time); 
} 

動畫只需100毫秒。然而,當我運行這個程序時,應用程序會掛起,並且只會開始執行j = 15周圍的任務。有人知道這裏有什麼問題嗎?

+0

你在做什麼活動? – Simon

+0

如果你只聲明一個''Handler''並且在你的for -loop之外執行它有什麼區別嗎? – harism

+0

它的OnClick調用,並將處理程序移到外面並沒有任何幫助 – avikar96

回答

1

您正在循環的每次迭代中執行不必要的工作,例如在可以簡單地重用DecimalFormat時創建新的DecimalFormat。你也只需要一個Handler,每個View都有一個Handler。所有這一切應該運行得更順利。

首先,設置一些類變量:

final DecimalFormat twoDForm = new DecimalFormat("0.00"); 
TextView weightGainNumbers; 
int weightGainIndex = 0; 
final double[] weights; 

Runnable r = new Runnable() { 
    public void run() { 
     weightGainNumbers.setText("Week:\t" + (weightGainIndex + 1) + "\nWeight Change:\t" 
        + twoDForm.format(weights[weightGainIndex]) + "%"); 

     if(weightGainIndex > 0) 
      animate(weights[Math.abs(weightGainIndex - 1)], weights[weightGainIndex], false); 
     // This animation is a guess, but you get the idea... 
     else 
      animate(0, weights[weightGainIndex], false); 

     weightGainIndex++; 
     // Call the next animation or reset the index for next time 
     if(weightGainIndex < weights.length) 
      weightGainNumbers.postDelayed(r, 300); 
     else 
      weightGainIndex = 0; 
    } 
}; 

接下來,初始化onCreate()weightGainNumbers TextView的。

最後,使用這樣的:

int endTime = 52; 
weights = new double[endTime]; 
for (int j = 0; j < endTime; j++) { 
    newWeight = i.integrate(getCarbs(), getProt(), getFat(), newWeight, 
      height, age, PAL, gender, 7); 
    weights[j] = Math.max(percentChange * 100/(newWeight - weight), -100); 
} 
weightGainNumbers.post(r); 

讓我知道如果您有任何具體問題。

+0

如果runnable是一個類變量,它何時被調用? – avikar96

+0

哎呦,我現在修好了。讓我知道任何其他的混亂,因爲我不能真正運行這個自己。 – Sam

+0

非常感謝!它現在有效。 – avikar96

相關問題