2011-05-28 133 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