假设我计划在整个应用程序中使用一个executorservice,向其发送新的runnable或callable以执行/提交,然后我命令立即关闭。我只想把我的“任务”交给executorservice,让他处理它们,并在提供资源的情况下执行它们(他有多少线程可用,如果需要,他可以创建多少线程,然后相应地将这些任务排队)。
根据您在Android应用程序中使用ExecutorService的经验,并考虑到应用程序状态的变化,如果我不想经常关闭并重新创建ExecutorService,请执行以下操作:
executor = Executors.newCachedThreadPool();
executor.submit(some Runnable);
executor.shutdown();
,您会在何时何地重新关闭服务,然后恢复服务,以便我可以防止一些泄漏或一些无法预见的后果?
我主要是指:
1) 通过Backback中最后一个活动的back按钮关闭应用程序(应用程序使用许多活动)2)应用程序进入后台(在任何这些活动中)3)应用程序返回前台(在任何这些活动中)
虽然这个问题已经发布多年了,但最近Android API 30已经不推荐AsyncTask,有人可能会被困在这里。要回答这个问题,没有必要关闭singleton ExecutorService,除非它有任何空闲线程。根据甲骨文文档:
程序中不再引用且没有剩余线程的池将自动关闭。如果要确保即使用户忘记调用shutdown()
,也能回收未引用的池,则必须通过设置适当的保持活动时间,使用零核心线程的下限,安排未使用的线程最终消亡。。。
执行者。newCachedThreadPool()对于这种情况是一种很好的工厂方法。当应用程序进程终止时,它将自动关闭。
我的申请。爪哇:
public class MyApplication extends Application {
private static ExecutorService executorService = Executors.newCachedThreadPool();
...
public static Executor getExecutor() {
return executorService;
}
}
只需在代码中的任何地方使用MyApplication.getExecitor()
。
我有一个ExecutorService的单例实例,它通过Dagger的对象图作用于Android应用程序实例。因此,实例的寿命与应用程序对象本身的寿命一样长。由于Android的应用程序类不提供onDestroy()回调,所以永远不知道何时应该在ExecutorService上调用shutdown()。
由于担心内存泄漏,我还研究了ThreadPoolExecutor并使用它来找出答案。这就是我发现的:遗嘱执行人。newCachedThreadPool()使用以下参数创建ThreadPoolExecutor:
ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>())
这是corePoolSize为0的值,这意味着至少有0个工作线程处于活动状态,因此没有工作线程。当TPE(也称为ExecutorService)执行任务时,它会创建一个工作线程并将其添加到池中。现在,当在60秒的超时期间没有新任务进入时,工作线程(仍保持活动状态)将终止并从池(缓存)中删除。
对我来说,这意味着不会出现内存泄漏,即使从未对ExecutorService调用shutdown(),因为所有存在的工作线程都会超时,并且在超时期间没有新任务进入时将从池中删除。我猜这样一来,池中就不会有对工作线程的任何引用,因此GC可以清理TPE实例。
如果我错了,请随时纠正我。
您可以做一种工作。将执行程序创建为守护程序。然后它将在您的应用程序退出时自动结束。您不必显式调用关闭
。
ExecutorService es = Executors.newSingleThreadExecutor( new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setDaemon(true);
return t;
}
});
我正在开发一个应用程序,不断地从Kafka主题中读取数据。这些数据是字符串格式的,然后我将其写入xml文件 要编写这些文件,我使用执行服务。 我想知道什么时候应该关闭我的执行服务。如果我的应用程序是有时间限制的,我会在executor实例上使用它,但我的应用程序应该持续运行。 如果发生任何异常,我的整个应用程序被杀死,它会自动关闭我的执行者吗?或者我应该捕获一个未检查的异常并关闭我的执行器,就像我
在我开发一个小型android应用程序的过程中,我遇到了一个问题,即使应用程序被用户终止,也无法运行警报管理器。当应用程序在前台或后台运行时,一切都很好。 我已经完成了follwing步骤: AndroidManifest.xml MainActivity.java在一个按钮的OnClick方法中,我称之为 x是类范围的vsisible变量 `public void startAlert(long
我知道这个问题在网站上被问了很多,但是,我似乎找不到一个解决办法。当应用程序未运行时,不调用我的BOOT_COMPLETED接收器。 清单: 如果应用程序正在运行,并且我使用 事件被正确接收,但是,如果应用程序被关闭,事件不会被接收,也不会在启动时被接收。 我已经安装了应用程序,然后启动了它几次,以确保它已经注册。我对这件事很迷茫,所以任何建议都将非常感谢。
Firebase push在某些设备上不起作用,当应用程序关闭时只有数据负载。请参阅以下线程:https://github.com/firebase/quickstart-android/issues/41 我知道当应用程序被swipe杀死时,一些OEM会杀死应用程序的所有服务,这些服务直接影响FirebbaseMessagingService并且由于这个onMessageReceived()方法
我正在编写一个带有ExecutorService的单例类的SDK。它看起来像这样: 此SDK类用于在整个应用程序中运行任务/可运行程序,doSomething()函数用于在单个线程中排队并运行所有可运行程序。 但有一件事我搞不清楚,那就是什么时候给ExecutorService打电话。shutdown()方法。如果我这样称呼它: 它会破坏使用一个Thread的目的,因为如果在第二次调用doThin