countDownTimer не работает, почему? - PullRequest
0 голосов
/ 29 мая 2011

У меня есть служба B, которая отправляет определенное количество сообщений через фиксированный интервал.эта служба вызывается из другой службы A. код, используемый в службе A, равен

@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();
}

Как я уже говорил, я использую тосты, чтобы отслеживать происходящее.проблема заключается в том, что при запуске я получаю первый тост (служба B при запуске) 10 раз, а затем второй (служба B по таймеру) 10 раз, следовательно, между ними нет времени.

как мнезаставлять каждый из этих тостов появляться каждые 30 секунд?

Ответы [ 2 ]

0 голосов
/ 29 мая 2011

Хорошо, итоговый ответ может быть примерно таким: Вызовите только один раз службу 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 голосов
/ 29 мая 2011

Если вы хотите делать тост каждые 30 секунд, чем вы можете сделать это с помощью обработчика:

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

Если у вас есть проблемы с этим, просто напишите здесь, и я постараюсь помочь вам ..

...