使用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
相关产品推荐
相关产品推荐

