所以我把我所有的作業都換成了這些作業代表。
在當前的重構狀態中,我有兩個問題。
我有很多工人班,假設這些是 W1、W2、W3 ......
我的問題是,當我將作業安排為 onTime 和定期作業時。我使用帶有 uniq 標簽的 uniq 作品。我的問題是,當我將 W1 作為帶有“W1_TAG”標簽的周期排隊,然后我想從 W1 創建一個具有相同標簽的 onTime 時,它??不會啟動,因為還有另一個具有相同標簽的作業。
我想實作這一點,如果我啟動 W1 工人,然后啟動 W2 工人作為定期,然后我啟動 W2 作為 onTime,操作將如下:
-W1開始 -W2周期性看到了,W1跑了,所以他會一直等到w1成功 -w2 onTime看到了,還有一個W2(不管是不是周期性的),他會被移除?通過作業管理器,所以 w2 定期保留,w2 不會按時運行
我知道有一個 enqueUniqWork 可能性,但它只附加或保留以前的作業人員,并且這不適用于不同的標簽。
所以目前我通過添加不同的標簽解決了這個問題,但我想知道,我可以同樣解決這個問題嗎?
作業安排
fun schedulePeriodicAsync(context: Context) {
val constraint =
Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED).build()
val data = Data.Builder()
data.putBoolean(IS_PERIODIC_KEY, true)
val sendCertificatesWorker =
PeriodicWorkRequest.Builder(
SendCertificatesWorker::class.java, 900000, TimeUnit.MICROSECONDS
)
.setConstraints(constraint)
.setInputData(data.build())
.setBackoffCriteria(
BackoffPolicy.LINEAR,
OneTimeWorkRequest.MIN_BACKOFF_MILLIS,
TimeUnit.MILLISECONDS
).build()
WorkManager.getInstance(context).enqueueUniquePeriodicWork(
TAG,
ExistingPeriodicWorkPolicy.KEEP, sendCertificatesWorker
)
}
fun scheduleNowAsync(context: Context, workCallback: JobCallback? = null) {
jobCallback = workCallback
val constraint =
Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED).build()
val data = Data.Builder()
data.putBoolean(IS_PERIODIC_KEY, false)
val sendCertificatesWorker =
OneTimeWorkRequest.Builder(SendCertificatesWorker::class.java)
.setConstraints(constraint)
.setInputData(data.build())
.setBackoffCriteria(
BackoffPolicy.LINEAR,
OneTimeWorkRequest.MIN_BACKOFF_MILLIS,
TimeUnit.MILLISECONDS
)
.build()
WorkManager.getInstance(context).enqueueUniqueWork(
TAG_NOW,
ExistingWorkPolicy.KEEP, sendCertificatesWorker
)
}
Worker class:
class SyncPricesWorker(
val healthCheckApi: HealthCheckApi,
val synchronizer: Synchronizer,
val sharedPreferences: SharedPreferences,
private val context: Context,
workerParams: WorkerParameters
) : CoroutineWorker(context, workerParams) {
override suspend fun doWork(): Result {
Timber.d("SyncWorker starts")
var workResult = Result.success()
if (runAttemptCount >= 3) {
return Result.failure()
}
workCallback?.jobStart()
withContext(Dispatchers.IO){
Timber.d("SyncWorker middle")
try {
healthCheckApi.checkHealth(ApiModule.API_KEY).await()
synchronizer.sendInvoices()
} catch (e: Exception) {
workCallback?.jobEnd()
workResult = Result.retry()
}
}
if (workResult == Result.success()) {
workCallback?.jobEnd()
sharedPreferences.edit().putLong(ApiParameters.KEY_LATEST_PRODUCT_PRICE_SYNC_DATE, Date().time).apply()
}
Timber.d("SyncWorker end")
return workResult
}
Synchronization class method:
suspend fun sendInvoices(invoiceHeaderIdToSend: String? = null): SendResult {
val asd = invoiceRepository.getInvoicesWithStatus(0, invoiceHeaderIdToSend ?: "")
if (asd.isEmpty()) return SendResult.success(10)
val asd2 = salesApi.sendInvoices(asd).await()
return if (asd2.isSuccessful) {
val invoicesList = arrayListOf<InvoiceHeader>()
invoicesList.addAll(asd)
invoicesList.forEach { it.status = Constants.STATUS_SENT.code }
invoiceRepository.updateInvoiceHeaders(invoicesList)
SendResult.success(asd.size)
} else {
Timber.tag("sendInvoices").e(asd2.errorBody()?.string().toString())
SendResult.error(asd.size, asd2.errorBody()?.string().toString())
}
}
uj5u.com熱心網友回復:
WorkManager 的 TAG 是您的 WorkRequest 的屬性,您addTag()在以下設定中使用WorkRequest.Builder:
val sendCertificatesWorker =
PeriodicWorkRequest.Builder(
SendCertificatesWorker::class.java, 900000, TimeUnit.MICROSECONDS
)
.setConstraints(constraint)
.setInputData(data.build())
.setBackoffCriteria(
BackoffPolicy.LINEAR,
OneTimeWorkRequest.MIN_BACKOFF_MILLIS,
TimeUnit.MILLISECONDS
)
.addTag(TAG) // <- ADDING A TAG
.build()
當您將獨特的作品加入佇列時,您是在使用uniqueName來標識該獨特的作品。
WorkManager.getInstance(context).enqueueUniqueWork(
UNIQUE_NAME_NOW,
ExistingWorkPolicy.KEEP, sendCertificatesWorker
)
也就是說,WorkManager 允許為 OneTimeWorkers設定工人鏈,但不能為 PeriodicWorkers 設定。
在我看來,實作您想要的最佳選擇是在 W2 的開頭添加一些控制元件來檢查 oneTimeWorkers 的狀態(使用唯一的 TAGs ),并在那里應用實作所需結果所需的邏輯。
如果您想涵蓋 W2 Periodic 已經運行的情況,并且您啟動 OneTime W1,則需要注意一些。在這種情況下,或者您從 W1 中取消定期 W2(并在 W2 中處理取消),或者您最終可能會同時運行 W1 和 W2。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/362397.html
