#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