我的问题是,在我的项目中打开某个活动后,我初始化一个ScheduledExecutorService,每20秒向IntentService类发送一次Intent。
现在,当我第一次打开包含ScheduledExecutorService的活动时,Intent按计划每20秒触发一次。
当我退出活动(留在应用程序中)然后重新进入活动时,会出现问题。这导致Intent在20秒的窗口中被发送两次,我认为它与我在我的活动的onResume中创建一个新的ScheduledExecutorService有关。
如何确保在任何给定时间只有一个ScheduledExecutorService实例?
相关代码如下:
@Override
public void onResume() {
super.onResume();
ScheduledExecutorService scheduleIntentSender = Executors.newScheduledThreadPool(1);
scheduleIntentSender.scheduleAtFixedRate(new Runnable() {
public void run() {
sendIntent();
}
}, 0, 20,TimeUnit.SECONDS);
mDownloadStateReceiver =
new DownloadStateReceiver();
// Registers the DownloadStateReceiver and its intent filters
LocalBroadcastManager.getInstance(this).registerReceiver(
mDownloadStateReceiver,
testIntentFilter);
}
答案 0 :(得分:0)
我建议不要在Activity
中执行此操作,因为它旨在显示用户界面。请改为Service
。您可以在Service
中启动onStart
并跟踪Service
中执行者的状态,无论其是否已启动。 Service
很好,因为它是一个背景组件,根本不依赖于UI。它在屏幕旋转等过程中不会受到影响。
答案 1 :(得分:0)
您应该在结束活动后取消之前的ScheduledExecutorService
:
ScheduledExecutorService scheduleIntentSender = Executors.newScheduledThreadPool(1);
final ScheduledFuture schedulHandler = scheduleIntentSender.scheduleAtFixedRate(new Runnable() {
public void run() {
sendIntent();
}
}, 0, 20,TimeUnit.SECONDS);
//Call schedulHandler.cancel(true) to cancel scheduleIntentSender in onDestroy()