2011-05-28 184 views
0

我有一個服務B以固定的時間間隔發送特定數量的消息。 該服務從其他服務A.叫 在服務質量上使用的代碼是countDownTimer不工作,爲什麼?

@Override 
public void onStart (Intent intent,int startid) 
{ 
    Toast.makeText(this, "Service A Running onStart", Toast.LENGTH_LONG).show(); 

    Thread MessagesThread = new Thread(new Runnable() 
    { 
     public void run() 
     { 
      ApplicationPreferences AppPrefs = new ApplicationPreferences(getApplicationContext()); 
      int NumberOfMessagesToSend = Integer.parseInt(AppPrefs.getNumberOfMessagesToSend()); 
      int NumberOfSentMessages; 

      for (NumberOfSentMessages = 0 ; NumberOfSentMessages < NumberOfMessagesToSend; NumberOfSentMessages++) 
      {startServiceB(); 
      } 
     } 
    }); 
    MessagesThread.start(); 
} 

public void startServiceB() 
{ 
    final Intent sendingMessages = new Intent(this, ServiceB.class); 
    startService(sendingMessages); 
} 

祝酒詞是跟蹤發生了什麼 在服務B的代碼是作爲遵循

@Override 
public void onStart(Intent intent, int startId) 
{ 
    super.onStart(intent, startId); 
    Toast.makeText(getApplicationContext(), "Service B at start ", Toast.LENGTH_LONG).show(); 
    new CountDownTimer(30000,1000) 
    { 
     public void onTick (long millisUntilFinished) {} 

     public void onFinish() 
     { 
      showToast(); 
     } 
    }.start(); 
} 

的showToast()函數爲

public void showToast() 
{ 
    Toast.makeText(getApplicationContext(), "Service B in timer", Toast.LENGTH_LONG).show(); 
} 

正如我所說的,我使用的祝酒詞來跟蹤什麼HAPP效果圖創作。問題是運行它時,我得到第一個吐司(服務B在開始)10倍,因此第二個(服務B在計時器中)10倍,因此他們之間沒有時間。

我該如何讓這些吐司每30秒出現一次?

+0

那麼你想每30秒鐘舉杯一杯嗎? – Cata 2011-05-28 20:29:37

回答

0

好了,所以最終的答案可能是這樣的: 電話只有一次B服務和在它我們將有處理程序將循環在30秒的時間間隔..

服務B代碼:

int loop = 5; 
    int counter = 0; 
Handler myHandler; 
Runnable run; 

    @Override 
    public void onStart(Intent intent, int startId) 
    { 
     super.onStart(intent, startId); 
     Toast.makeText(getApplicationContext(), "Service B at start ", Toast.LENGTH_LONG).show(); 
     myHandler = new Handler(); 
     run = new Runnable() 
     { 
     public void run() 
     { 
      if (counter<loop){ 
      showToast(); 
      counter++; 
      } else { 
      myHandler.removeCallbacks(run); 
      } 
     } 
     }; 
     myHandler.postDelayed(run, 30000); 

    } 

我希望這可以幫助別人!

+0

它工作gr8。 thx Cata:D – wassim 2011-05-29 22:51:45

0

如果你想敬酒,每30秒多,你可以做到這一點通過使用一個處理程序:

Handler myHandler = new Handler(); 
Runnable run = new Runnable() 
{ 
    public void run() 
    { 
     showToast();     
    } 
}; 
myHandler.postDelayed(run, 30000); 

如果你有這樣的問題只是張貼在這裏,我會盡力幫助你..

+0

仍然有同樣的問題。也許問題來自服務A.正如我所說的敬酒只是爲了測試計時器是否工作。 – wassim 2011-05-28 21:10:20

+0

正如我在上面的示例中所看到的那樣,您在for語句中創建了一個ServiceB的新實例? – Cata 2011-05-28 21:13:35

+0

是的,但我想它是不止一次創建。也許這就是問題所在。它嘗試了以下代碼服務 \t while(NumberOfSentMessages!= NumberOfMessagesToSend) \t \t \t {Handler myHandler = new Handler(); \t \t \t Runnable運行=新可運行() \t \t \t { \t \t \t \t公共無效的run() \t \t \t \t { \t \t \t \t \t \t \t \t \t \t startServiceB(); \t \t \t \t \t \t \t \t \t} \t \t \t}; \t \t \t myHandler.postDelayed(run,30000); \t \t \t NumberOfSentMessages ++; \t \t \t} 它給力閉合誤差。我真正需要的是每30秒運行一次服務B的實例 – wassim 2011-05-28 21:18:44