并行倒数计时器
Parallel Countdown Timers
我怀疑同时使用多个倒数计时器的最佳方式是什么。
我已经在这样做了(在 UI 线程上)并且我正在更新许多组件(Textview、带数据的 rv、imageviews)。它有效,但我注意到 UI 在我想要切换我正在显示的“警报”时变得有点迟钝。
我还想在后台发出此警报 运行,并显示剩余时间的通知,我认为我永远无法用我制作的 UI Thread 东西做到这一点。
这样做的正确方法是什么?
来自任何 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
发送到同一个应用程序。 (即仅从我们的应用向我们的应用发送广播。)
Register it in any activity like :
IntentFilter filterTicks = new IntentFilter("ticks");
registerReceiver(secondsBroadcastReceiver, filterTicks);
Un-register in the same activity once tasks are finished / onDestroy /
OnPause :
unregisterReceiver(secondsBroadcastReceiver);
How to use :
您已经注意到上面代码中的 broadcastreceiver,例如:
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);
}
};
- 您可以从中设置/更改 UI textview 文本多次
它在背景中滴答作响。
- 我们只需要在每次报价后发送广播
- 其适当的接收者接收并更新UI(我们需要设置它)
- 只要它保持在那里,它就会发送广播和接收。
- 你只需要更换定时器方法,因为你的滴答声会减少,现在我把它留给你编程休息。
我怀疑同时使用多个倒数计时器的最佳方式是什么。 我已经在这样做了(在 UI 线程上)并且我正在更新许多组件(Textview、带数据的 rv、imageviews)。它有效,但我注意到 UI 在我想要切换我正在显示的“警报”时变得有点迟钝。
我还想在后台发出此警报 运行,并显示剩余时间的通知,我认为我永远无法用我制作的 UI Thread 东西做到这一点。
这样做的正确方法是什么?
来自任何 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
发送到同一个应用程序。 (即仅从我们的应用向我们的应用发送广播。)
Register it in any activity like :
IntentFilter filterTicks = new IntentFilter("ticks");
registerReceiver(secondsBroadcastReceiver, filterTicks);
Un-register in the same activity once tasks are finished / onDestroy / OnPause :
unregisterReceiver(secondsBroadcastReceiver);
How to use :
您已经注意到上面代码中的 broadcastreceiver,例如:
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);
}
};
- 您可以从中设置/更改 UI textview 文本多次 它在背景中滴答作响。
- 我们只需要在每次报价后发送广播
- 其适当的接收者接收并更新UI(我们需要设置它)
- 只要它保持在那里,它就会发送广播和接收。
- 你只需要更换定时器方法,因为你的滴答声会减少,现在我把它留给你编程休息。