我在我的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());
}
}
});
}
}发布于 2021-03-09 08:12:04
我相信工作经理根据工人类来区分工作,因为您使用的是同一个工人类,所以只会考虑到第一个作业(有相同的数据,其中包含在您的情况下的航班详细信息)。
意思是,当第一次工作被安排的时候,一切都是好的。但是,当你安排第二个相同的工人-它将再次使用以前的工作。
在不同的上下文中使用同一个工人类是可以的,但是您应该让工作经理知道如何区分工作和同一个工人。
我建议使用唯一的名称,而不是:
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
);https://stackoverflow.com/questions/66540734
复制相似问题