Таймер обратного отсчета не работает, почему?

#android #timer #countdowntimer

#Android #таймер #таймер обратного отсчета

Вопрос:

У меня есть служба 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 секунд?

Комментарии:

1. Итак, вы хотите показывать тост каждые 30 секунд?

Ответ №1:

Хорошо, итак, окончательный ответ может быть примерно таким: вызовите только один раз службу 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);

    }
  

Я надеюсь, что это поможет кому-то еще тоже!

Ответ №2:

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

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

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

Комментарии:

1. Все еще возникает та же проблема. возможно, проблема в службе A. Тост, как я уже сказал, предназначен только для проверки, работает ли таймер.

2. Как я вижу в вашем примере выше, вы создаете новый экземпляр ServiceB в этом операторе for?

3. да, но я предполагаю, что он создается более одного раза. возможно, в этом проблема. он попробовал следующий код в сервисе, пока (NumberOfSentMessages != NumberOfMessagesToSend) {Обработчик MyHandler = новый обработчик(); Запускаемый run = new Runnable() { public void run() { startServiceB(); } }; MyHandler.postDelayed(run, 30000); NumberOfSentMessages ; } выдавал ошибку принудительного закрытия. Что мне действительно нужно, так это запускать экземпляр службы B каждые 30 секунд

4. тогда вам нужно вызвать метод startService () только один раз, не в инструкции for, и, пожалуйста, предоставьте нам журнал с ошибкой принудительного закрытия, спасибо!

5. ошибка была «не удается создать обработчик внутри потока». я удалил поток, но я все еще не могу понять, как вызывать экземпляр ServiceB каждые 30 секунд. позвольте мне сформулировать это так: у меня есть ServiceA, который вызывает новый экземпляр ServiceB каждые 30 секунд, а затем закрывает его 5 раз. как я могу это сделать. И, кстати, спасибо большое за помощь: D