2012-11-24 111 views
0

任何人都可以告訴我,如果這是一件安全的事情嗎?我運行一個倒數計時器(CountDownTimer),當計時器達到零時,它必須重新開始計數,例如計算一個較長的時間。要做到這一點,我打電話Android CountDownTimer範圍

timer = new TableCount(nextTime * 1000, 100); 

在onFinish()方法。

它運行沒有問題,但我擔心它可能會導致內存泄漏。我是否應該讓計時器發出某種通知,告知它已完成?以下是活動代碼的重要位:

public class TableActivity extends Activity { 
    TableCount timer; // the count down timer 
    protected int nextTime; 
    ... 
    // somewhere I call this - user clicked the "start" button 
    timer = new TableCount(nextTime * 1000, 100); 
    nextTime += 100; // for example 
    ... 
    public class TableCount extends CountDownTimer 
    { 
     public void onFinish() { 
      ... // check if number of iterations has been reached, else: 
      // start counting down from the next value 
      timer = new TableCount(nextTime * 1000, 100); 
      nextTime += 100; // for example 
     } 
    } 

回答

0

,因爲你只是更改爲新的計時器,它隱含解引用以前的對象你的TableCount的單筆申報的參考你不會泄漏內存。

即使你做了奇怪的事情,比如創建一個新的計時器,每次運行並將其添加到數組(例如),你仍然不會泄漏。您最終可能會耗盡內存,但這與活動完成後的泄漏不同,並且假設您沒有在其他地方持有靜態引用,則會釋放內存並符合垃圾回收的條件。

但是,爲什麼不重複使用現有的計時器並使用schedule()再次運行它?

+0

謝謝 - 我做8次迭代的最大值,所以我認爲,內存使用是安全的。順便說一下,CountDownTimer似乎沒有schedule()方法 - 似乎並不是太容易重置countdowntimer – mogoman

+0

對不起,我在想Timer,而不是CountdownTimer。在那種情況下,你在做什麼很好。實際上,你甚至沒有添加到使用的內存中。我關於循環的一點是,如果你不知道如何保持定時器的前一個實例,那麼它只會使用增加的內存,而你並沒有這樣做。 – Simon

0

不需要重新初始化計時器.... 試試這個...

int temp=nexttime; 
    public class TableCount extends CountDownTimer 
    { 
     public void onFinish() { 
     nexttime=temp; 
     timer.start(); 
     } 
    } 
+1

不起作用,調用timer.start()只是從原來的時間開始,而不是從下次開始 – mogoman

-1
public class ServiceCount extends CountDownTimer 
{ 
    public ServiceCount(long millisInFuture, long countDownInterval) 
    { 
     super(millisInFuture, countDownInterval); 
    } 

    @Override 
    public void onFinish() 
    { 
      count = new ServiceCount((long) (1 * 60 * 1000), 1000); // 1 minute 
      count.start(); 
    } 

    @Override 
    public void onTick(long millisUntilFinished) 
    { 
     Log.d("timer", "" + millisUntilFinished/1000); 
    } 
} 

ServiceCount count = new ServiceCount((long) (1 * 60 * 1000), 1000); // 1 minute 
count.start(); 
+0

你可以改變onFinish()的時間,例如'count = new ServiceCount((long)(2 * 60 * 1000), 1000); // 2分鐘' –

+0

是的,你是對的,但你的例子與問題中的完全相同。問題是,我正在做什麼(事實上你的代碼在做什麼)可以被視爲從內存泄漏的角度來看是「安全的」 - 正如我所提到的,我的代碼可以100% – mogoman