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

Android(Java)定时执行任务遇空指针异常,求修复及替代方案

修复空指针异常及实现定时任务的方案

一、修复你的空指针问题

你的代码出现NullPointerException是变量遮蔽导致的:你定义了成员变量public Thread hilo;,但初始化时又声明了同名局部变量Thread hilo = new Thread(runnable);,如果hilo.start();实际调用的是未初始化的成员变量(比如局部变量的声明在有限作用域内,超出后失效),就会触发空指针。

同时你的代码里还有语法错误(不完整的注释/、多余的tiempo标识符),需要一并修正。调整后的代码如下(已改成每分钟执行一次):

public Thread hilo;

Runnable runnable = new Runnable() {
    @Override
    public void run() {
        while (true) {
            try {
                // 每分钟执行一次,休眠60000毫秒
                Thread.sleep(60000);
                // 替换成你的指定函数
                System.out.println("每分钟执行一次");
            } catch (InterruptedException e) {
                e.printStackTrace();
                // 线程被中断后退出循环,避免无效执行
                break;
            }
        }
    }
};
// 去掉局部变量的类型声明,直接给成员变量赋值
hilo = new Thread(runnable);
hilo.start();

二、更可靠的定时任务实现方式

除了Thread.sleep的基础方式,还有两种更适合生产环境的方案:

1. 使用ScheduledExecutorService(推荐用于普通Java/Android前台任务)

这是Java官方提供的定时任务API,比Thread.sleep更稳定,支持灵活的调度策略:

// 创建单线程调度池,按需可换成newScheduledThreadPool(n)多线程版本
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();

// 立即开始执行,之后每隔60秒重复一次
scheduler.scheduleAtFixedRate(new Runnable() {
    @Override
    public void run() {
        // 执行你的指定函数
        System.out.println("每分钟执行一次");
    }
}, 0, 60, TimeUnit.SECONDS);

// 在不需要任务时(比如Activity销毁),务必关闭调度池避免内存泄漏
// scheduler.shutdown();

2. 使用AlarmManager(Android后台定时任务专用)

如果是Android平台,需要在App后台也保持定时任务,推荐用AlarmManager(不受线程阻塞影响,能唤醒设备):

步骤1:创建广播接收器处理任务

public class TaskReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 执行你的指定函数
        System.out.println("每分钟执行一次");
    }
}

步骤2:在AndroidManifest.xml注册接收器

<receiver android:name=".TaskReceiver" />

步骤3:设置定时任务

AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, TaskReceiver.class);
// 注意添加FLAG_IMMUTABLE适配Android 12+
PendingIntent pendingIntent = PendingIntent.getBroadcast(
        this, 
        0, 
        intent, 
        PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE
);

// 设置每分钟重复执行的定时任务
long triggerTime = System.currentTimeMillis();
alarmManager.setRepeating(
        AlarmManager.RTC_WAKEUP, 
        triggerTime, 
        60 * 1000, 
        pendingIntent
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 22:57:49