我有一个服务在监听传入的FCM通知。收到此类通知后,我将使用WorkManager运行作业。
同时接收到多个通知时,如何确保一次只执行一项作业?作业应按顺序执行。在这种情况下,我要发送短信,并且这些短信不能同时发送。 (请注意,在发送短信之前和之后,我还会在此作业中执行其他操作,例如http请求,这就是为什么我决定为其创建作业而不是直接从服务发送短信的原因。)
public class MyFirebaseMessagingService extends FirebaseMessagingService {
public void onMessageReceived(RemoteMessage remoteMessage) {
//...
OneTimeWorkRequest sendSmsWorker = new OneTimeWorkRequest.Builder(SendSmsWorker.class).build();
WorkManager.getInstance().enqueue(sendSmsWorker);
//...
}
}
我已经检查了WorkManager文档中的高级部分;它提到了链式序列,但是它们必须显式地彼此链结(beginWith / then / then /...)。
答案 0 :(得分:9)
您需要将作业创建为具有相同组名的OneTimeWorkRequest,并使用APPEND将它们排队为唯一的工作。 这会将所有作业附加到同一链上并按顺序执行。
请注意,您应该始终始终返回Result.SUCCESS或Result.RETRY。返回Result.FAILURE将取消所有排队的作业。 如果您需要知道作业是否失败,则可以在worker setOutputData中设置一个自定义标志,以处理所需的情况。
final String JOB_GROUP_NAME = "your_jobs_group_name";
......
OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(YOUR_WORK.class)
.setInputData(YOUR_WORK_DATA_BUILDER.build())
.build();
final WorkManager workManager = WorkManager.getInstance();
WorkContinuation work = workManager.beginUniqueWork(JOB_GROUP_NAME, ExistingWorkPolicy.APPEND, request);
work.enqueue();