从BeaconIntentProcessor onHandleIntent调用didEnterRegion和didExitRegion。鉴于onHandleIntent的性质以及它在方法结束时终止的事实,它无法在其中运行postDelayed调用。
.....
@Override
public void didEnterRegion(Region region){
Handler handler = new Handler();
handler.postDelayed(new Runnable(){
@Override
public void run(){
// not run after 60 seconds
}
}, 60000);
}
...
如果我需要在didEnterRegion或didExitRegion中执行延迟方法调用,那么一般的最佳做法是什么?我是否使用报警管理器?我不愿意,因为它似乎有点重,只是为了能够执行延迟动作。
答案 0 :(得分:0)
更新:我已经用本机Java计时器/计时器任务或ScheduledExecutorService替换它,它运行良好。它们都旋转了一个新的线程,它在onHandleIntent终止时不像处理程序那样附加到创建它的线程上。因此,如果您在intent服务onHandleIntent中创建一个新的处理程序,那么当onHandleIntent完成执行时,处理程序将会死亡。
更新:或者,正如David Young所建议的,在AltBeacon didEnterRegion调用其方法之前,在单独的线程上创建处理程序(例如:在主线程或单独的服务上运行的单例类中将处理程序实例化为类变量)调用/ didExitRegion。无论你做什么,都不要在onHandleIntent中创建一个post延迟的新处理程序对象,因为处理程序将附加到intent服务线程并在完成执行时与它一起死掉,从而不会在post延迟中执行runnable。
由于Java Timer vs ExecutorService?中所述的原因,提倡使用ScheduledExecutorService而不是本机计时器/计时器任务。
private static final ScheduledExecutorService mWorker = Executors.newSingleThreadScheduledExecutor();
@Override
public void didEnterRegion(Region region){
new Timer().schedule(new TimerTask(){
@Override
public void run (){
// remember to free timer after using it
// it runs after didEnterRegion finishes execution, and after 60 seconds
}
}, 60000);
}
@Override
public void didEnterRegion(Region region){
mWorker.schedule(new Runnable(){
@Override
public void run (){
// it runs after didEnterRegion finishes execution, and after 60 seconds
}
}, 60000);
}