You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android如何按1秒间隔调用ExecutorService直至Activity进入onPause状态

实现方案

你之前触发OutOfMemoryError的核心原因是未对后台线程做生命周期绑定的资源释放,导致持有Activity引用的线程/线程池无法被GC回收,最终内存溢出。要实现生命周期感知的1秒间隔后台拉取,不要用自定义线程+Thread.sleep()的方式,直接使用ScheduledExecutorService(ExecutorService的子接口,专门用于周期/延迟任务调度)即可,配合生命周期回调自动停止任务,不会出现内存泄漏问题。

可直接复用的实现代码

首先在对应Activity中声明全局成员变量,禁止在普通方法内局部创建线程池后不持有引用,否则无法在页面退出时释放资源:

// 周期任务调度线程池
private ScheduledExecutorService scheduledExecutor;
// 调度任务句柄,用于取消任务
private ScheduledFuture<?> pullDataTask;
// 拉取间隔:1秒
private static final long TASK_INTERVAL = 1000;

在页面可见的onResume()生命周期中初始化线程池、启动周期任务:

@Override
protected void onResume() {
    super.onResume();
    // 初始化单线程调度池,注意工具类名是Executors,你之前的示例代码此处拼写错误
    scheduledExecutor = Executors.newSingleThreadScheduledExecutor();
    // 提交周期任务:首次无延迟执行,之后每间隔1秒执行一次
    pullDataTask = scheduledExecutor.scheduleAtFixedRate(() -> {
        // 此处写后台拉取数据的逻辑,比如网络请求、数据库查询
        // 注意:工作线程不能直接更新UI,需要切回主线程操作
        runOnUiThread(() -> {
            // 此处写拿到数据后的UI更新逻辑
        });
    }, 0, TASK_INTERVAL, TimeUnit.MILLISECONDS);
}

在页面不可见的onPause()生命周期中统一停止任务、销毁线程池,彻底释放资源:

@Override
protected void onPause() {
    super.onPause();
    // 取消正在调度的周期任务,传入true表示如果任务正在执行则触发中断
    if (pullDataTask != null) {
        pullDataTask.cancel(true);
        pullDataTask = null;
    }
    // 关闭线程池,回收线程资源
    if (scheduledExecutor != null) {
        scheduledExecutor.shutdownNow();
        scheduledExecutor = null;
    }
}

之前代码的问题修正

  • 拼写错误修正:你给出的示例代码存在多处编译错误:Executor.newSingleThreadExecutor()正确写法为Executors.newSingleThreadExecutor(),publi void run()正确写法为public void run(),executroService为拼写错误。
  • 资源泄漏修正:之前的写法每次调用方法就新建一个ExecutorService,且从未调用shutdown方法释放线程资源,多次触发后会耗尽可用内存,最终触发OOM。
  • 调度逻辑修正:不要用自定义线程+Thread.sleep()实现周期调度,休眠中的线程无法被及时回收,会隐式持有Activity引用造成内存泄漏;上述方案在页面退到后台、跳转其他页面时会主动释放所有资源,不存在泄漏风险。

注意事项:如果拉取逻辑是网络请求,务必给请求设置合理的超时时间(建议5-10s),避免工作线程长时间阻塞占用内存。

内容的提问来源于stack exchange,提问作者gsharew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 13:06:23