问题描述
我的 android 应用程序中有一个工作经理,我正在使用它来实现一个周期工作请求,每 15 分钟发送一封电子邮件,但是,有时,在 15 分钟后,而不是 1 封电子邮件,多个电子邮件-为相同的工作发送邮件。我怎样才能解决这个问题?在我的 Worker
课程中,给定特定条件,我想在 15 分钟后仅针对特定作业发送一封电子邮件。
工人阶级
public class CloseFlight extends Worker {
private FlightRepository flightRepo;
public Context context;
DateTimeFormatter formatter;
LocalDateTime final_departure_time;
String aircraft_type;
public CloseFlight(@NonNull Context context,@NonNull WorkerParameters workerParams) {
super(context,workerParams);
this.flightRepo = new FlightRepository(context);
}
@RequiresApi(api = Build.VERSION_CODES.O)
@NonNull
@Override
public Result doWork() {
String flightnumber = getInputData().getString("flightno");
String date = getInputData().getString("departuredate");
formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
if(!(flightnumber==null || date == null)) {
Flight flight_value = flightRepo.getFlight(flightnumber,date);
String departure_time = flight_value.getFinal_departure_time();
final_departure_time = LocalDateTime.parse(departure_time,formatter);
String datetime_now = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
LocalDateTime time_now = LocalDateTime.parse(datetime_now,formatter);
long diffInMinutes = Duration.between(final_departure_time,time_now).toMinutes();
String email_status = flight_value.getFlight_closure_status();
\\I want this to be executed just once
if(diffInMinutes>60 && email_status.contentEquals("opened")) {
aircraft_type = flight_value.getAircraft_type();
String email = "Details " + "\n" + flightnumber + " " + date + "\n" + "\n" + "Date: " + " " + date + "\n" + "Aircraft Type: " + " " + aircraft_type;
//Sending the email from here
JavaMailAPI javaMailAPI = new JavaMailAPI(context,"myemailid@gmail.com","Email for " + flightnumber + " and Departure date: " + date,email);
javaMailAPI.execute();
FlightClosureStatus flightClosureStatus = new FlightClosureStatus(flightnumber,date,"emailsent");
flightRepo.updateFlightClosureStatus(flightClosureStatus);
}
}
return Result.success();
}
}
活动
for(int i =0 ; i< length_report; i ++) {
String status = reportitems.get(i).getStatus();
if(status.contentEquals("opened")){
String flightNumber = reportitems.get(i).getFlightNumber();
String departureDate = reportitems.get(i).getDepartureDate();
Data data = new Data.Builder()
.putString("flightno",flightNumber)
.putString("departuredate",departureDate).build();
Constraints constraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();
final PeriodicWorkRequest periodicWorkRequest2 = new PeriodicWorkRequest.Builder(CloseFlight.class,15,TimeUnit.MINUTES)
.setConstraints(constraints)
.setInputData(data)
.build();
WorkManager workManager = WorkManager.getInstance(ReportListingActivity.this);
workManager.enqueue(periodicWorkRequest2);
workManager.getWorkInfoByIdLiveData(periodicWorkRequest2.getId())
.observe(ReportListingActivity.this,new Observer<WorkInfo>() {
@Override
public void onChanged(@Nullable WorkInfo workInfo) {
if (workInfo != null) {
Log.d("periodicWorkRequest","Status changed to : " + workInfo.getState());
}
}
});
}
}
解决方法
我相信工作经理通过工人阶级区分工作,并且由于您使用相同的工人阶级,因此只会考虑第一个工作(使用相同的数据,其中包含您的航班详细信息)。>
意思是,当第一个工作被安排时,一切都很好。但是当你安排同一个工人的第二个时 - 它会再次使用前一个工作。
在不同的上下文中使用同一个worker类是可以的,但是你应该让工作经理知道如何区分同一个worker的work。
我建议改用唯一名称:
workManager.enqueue(periodicWorkRequest2);
使用这个:
workManager.enqueueUniquePeriodicWork(
“UNIQUE_NAME”,// Maybe you should use the flight number?
ExistingPeriodicWorkPolicy.KEEP,// to not send mail if another being sent right now
periodicWorkRequest2
);