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

使用WorkManager执行Periodic Work Request时,Worker类无法正确读取flightnumber输入数据的问题求助

问题根源与解决方案

这问题的核心原因非常直接——你在SendNotification类里定义的两个常量key值完全相同,都是空字符串,导致参数存储时发生了覆盖:

// 错误:两个常量的value都是空字符串,相当于同一个key
public static final String FLIGHTNUMBER="";
public static final String DATE = "";

当你在Activity中调用putString时,本质上是用同一个空字符串key连续存了两次值:第一次存航班号,第二次存起飞日期。WorkManager的Data类会用后存入的值覆盖前一个,所以最终InputData里只有起飞日期这一个有效数据。在Worker中读取时,不管用FLIGHTNUMBER还是DATE(本质都是空字符串key),拿到的都是最后存入的起飞日期;如果出现null,大概率是覆盖逻辑的边缘情况导致的。


修复步骤

只需要给两个常量设置唯一的非空字符串key即可,比如:

public class SendNotification extends Worker {
    // 给每个key设置唯一且有意义的名称
    public static final String FLIGHTNUMBER = "flight_number";
    public static final String DATE = "departure_date";
    
    public SendNotification(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }

    @RequiresApi(api = Build.VERSION_CODES.M)
    @NonNull
    @Override
    public Result doWork() {
        String flightnumber = getInputData().getString(FLIGHTNUMBER); // 现在能正确读取航班号了
        String date = getInputData().getString(DATE);
        sendNotification(flightnumber,date);
        return Result.success();
    }
}

你的Activity代码不需要修改,因为已经通过SendNotification.FLIGHTNUMBER和SendNotification.DATE引用了这些常量,只要常量值改对,Activity里的putString会自动使用正确的key。


小建议

为了避免不同Worker之间的key冲突,建议给key加上类名前缀,比如:

public static final String FLIGHTNUMBER = "SendNotification_FLIGHT_NUMBER";
public static final String DATE = "SendNotification_DEPARTURE_DATE";

这样即使项目里有多个Worker类,也不会出现key重复的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 08:37:28