Таймеры обратного отсчета - PullRequest
0 голосов
/ 07 января 2020

У меня есть сомнения относительно того, как будет наилучшим образом работать одновременно с несколькими таймерами обратного отсчета. Я уже делаю это (в UI Thread) и обновляю многие компоненты (Textview, rv с данными, imageviews). Это работает, но я заметил, что пользовательский интерфейс немного запаздывает, когда я хочу переключить отображаемый им «сигнал тревоги».

Я также хочу, чтобы эта сигнализация работала в фоновом режиме с уведомлением, показывающим оставшееся время Я думаю, что никогда не смогу сделать с этим потоком пользовательского интерфейса то, что я сделал.

Что будет правильным способом сделать это?

Спасибо всем!

1 Ответ

0 голосов
/ 07 января 2020

Из любого service или из любого intentservice или из asynctask вы можете иметь нить таймера (т.е. таймер обратного отсчета в вашем случае), например:

public void Timer()
{
    new Thread(new Runnable()
    {
        public void run()
        {
            while (IsOnGoing)
            {
                try
                {
                    TimeUnit.SECONDS.sleep(1);
                    seconds++;

                    int hour = seconds/3600;
                    int remaining = seconds%3600;

                    int minutes = remaining/60;
                    int seconds = remaining%60;

                    String hourString = (hour<10 ? "0" : "")+hour;
                    String minutesString = (minutes<10 ? "0" : "")+minutes;
                    String secondsString = (seconds<10 ? "0" : "")+seconds;

                    String InCallDuration = hourString + " : " + minutesString + " : " + secondsString;

                    Intent intent = new Intent("ticks");
                    intent.setPackage(getPackageName());
                    intent.putExtra("InCallDuration", InCallDuration);
                    getApplicationContext().sendBroadcast(intent);

                    Log.d("InCallService :", "InCallDuration"+ InCallDuration+".. \n");
                }
                catch (InterruptedException e)
                {
                    Log.d("CallStateService :", "InterruptedException.. \n");
                    e.printStackTrace();
                }
            }
        }
    }).start();

}

Если вы заметили строку сверху кода (указан ниже):

getApplicationContext().sendBroadcast(intent);

, который отправляет local broadcast в то же приложение. (т.е. отправка трансляции из нашего приложения только в наше приложение.)

Зарегистрируйте его в любом виде, например:

IntentFilter filterTicks = new IntentFilter("ticks");
registerReceiver(secondsBroadcastReceiver, filterTicks);

Отмена регистрации в том же действии, когда задачи завершены / onDestroy / OnPause:

unregisterReceiver(secondsBroadcastReceiver);

Как использовать:

Вы заметили, что в приведенном выше коде вещательный приемник выглядит так:

private BroadcastReceiver secondsBroadcastReceiver = new BroadcastReceiver()
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        String InCallDuration = intent.getStringExtra("InCallDuration");
        Log.d("CallActivity :", "Received InCallDuration:" + InCallDuration + ".. \n");
        CallTime.setText(InCallDuration);
    }
};
  1. Из которого вы можете устанавливать / изменять текст текстового интерфейса пользовательского интерфейса столько раз, сколько он тикает в фоновом режиме.
  2. Нам просто нужно отправлять трансляцию после каждого тика
  3. Соответствующий получатель получает его и обновляет пользовательский интерфейс (нам нужно установить его)
  4. Он отправляет широковещательные сообщения и получает до тех пор, пока он там остается.
  5. Вам нужно только заменить метод таймера как Ваши тики уменьшатся, теперь я оставил это вам для программирования отдыха.
...