Android Java : 如何在 App 不在前台时完全删除 ScheduledExecutorService 实例
Android Java : How to completely remove instance of ScheduledExecutorService when App is not in foreground
我有以下循环检查上次查看的代码块,我想从 运行 停止它,并在应用程序不再位于前台时释放资源。
对于以下内容,runnable 不会停止,它会继续。
ScheduledFuture<?> dfgh;
private void getLastSeen() {
AsyncTask.execute(new Runnable() {
@Override
public void run() {
ScheduledExecutorService scheduleTaskExecutor = Executors.newSingleThreadScheduledExecutor();
dfgh = scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() {
public void run() {
if (!Presence.screenLocked(A) && Presence.inForeground(A)) {
MessageHelper.getLastSeen(RECIPIENT, A);
System.out.println("Checking Presence");
} else {
System.out.println("App not in foreground or screen is locked");
dfgh.cancel(true);
//cancel here doesn't seem to cancel.
}
}
}, 0, 2, TimeUnit.SECONDS);
}
});
}
因为 ScheduledExecutorService
的范围是 run
的本地范围,所以您将无法通过其他方法控制它。
如果你看到 https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html you will see that they have their instance as a field. On this field you can call shutdownNow
我有以下循环检查上次查看的代码块,我想从 运行 停止它,并在应用程序不再位于前台时释放资源。
对于以下内容,runnable 不会停止,它会继续。
ScheduledFuture<?> dfgh;
private void getLastSeen() {
AsyncTask.execute(new Runnable() {
@Override
public void run() {
ScheduledExecutorService scheduleTaskExecutor = Executors.newSingleThreadScheduledExecutor();
dfgh = scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() {
public void run() {
if (!Presence.screenLocked(A) && Presence.inForeground(A)) {
MessageHelper.getLastSeen(RECIPIENT, A);
System.out.println("Checking Presence");
} else {
System.out.println("App not in foreground or screen is locked");
dfgh.cancel(true);
//cancel here doesn't seem to cancel.
}
}
}, 0, 2, TimeUnit.SECONDS);
}
});
}
因为 ScheduledExecutorService
的范围是 run
的本地范围,所以您将无法通过其他方法控制它。
如果你看到 https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html you will see that they have their instance as a field. On this field you can call shutdownNow