我在重新安排作业时遇到了WorkManager的问题。目前,我发现在使用Okhttp启动请求并在AuthInterceptor上引发错误之后的某个时刻,它卡住了,没有其他任务启动。
这是JobOrganizer
类,用于管理工作计划的第一步。它链接作业的第一个队列。您将看到更多未粘贴在此处的作业,但主要区别在于,第一个链接的作业没有WiFi网络限制,其他作业则没有。
object JobOrganizer { const val WORK_INTERVAL: Long = 20 const val SCH_DATA_UPDATE_WORK_RESCHEDULE = "scheduled_data_update_work_reschedule" const val SCH_DATA_UPDATE_WORK = "scheduled_data_update_work" private val schDataUpdateJob: OneTimeWorkRequest get() = OneTimeWorkRequestBuilder<SCHDataUpdateJob>() .addTag(SCH_DATA_UPDATE_WORK) .setConstraints(wifiConstraint) .build() val wifiConstraint: Constraints get() = Constraints.Builder() .setRequiredNetworkType(NetworkType.UNMETERED) .setRequiresDeviceIdle(false) .setRequiresBatteryNotLow(false) .setRequiresCharging(false) .setRequiresStorageNotLow(false) .build() fun getWorkInfos(context: Context, tag: String): LiveData<List<WorkInfo>> { val workManager = WorkManager.getInstance(context) return workManager.getWorkInfosByTagLiveData(tag) } private fun clearWorks(workManager: WorkManager) { workManager.pruneWork() } private fun cancelSCHJobs(context: Context) { val workManager = WorkManager.getInstance(context) workManager.cancelAllWorkByTag(SCH_DATA_UPDATE_WORK ) clearWorks(workManager) } fun scheduleJobs(context: Context) { cancelSCHJobs(context) WorkManager.getInstance(context) .beginWith(schTypesDownloadJob) .then(schDownloadJob) .then(schDataUpdateJob) .then(schDataUploadJob) .then(schCleanupJob) .enqueue() FirebaseAnalytics.getInstance(context).logEvent(AnalyticsEvents.Sync.SYNC_SCH_CONFIGURE_FORM_CLEANUP, Bundle()) } }
AuthInterceptor类
class AuthInterceptor(private val context: Context?) : Interceptor { @Throws(IOException::class) override fun intercept(chain: Interceptor.Chain): Response { val originalRequest = chain.request() if (context == null) { return chain.proceed(originalRequest) } val auth = AuthRepository(context).getAuth() if (auth.isNullOrEmpty()) { return chain.proceed(originalRequest) } val version = String.format( "%s: %s (build %s)", BuildConfig.FLAVOR, BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE ) val compressedRequest = originalRequest.newBuilder() .header("Authorization", String.format("Bearer %s", auth[0].token)) .header("mobile-app-version", version) .build() return chain.proceed(compressedRequest) } }
[更新作业,将自己重新安排时间,但延迟30分钟。主要尝试/捕获是针对AuthInterceptor错误。
class SCHDataUpdateJob(var context : Context, params : WorkerParameters) : Worker(context, params) { override fun doWork(): Result { FirebaseAnalytics.getInstance(context).logEvent(AnalyticsEvents.Sync.SYNC_SCH_UPDATE_START, Bundle()) var success = UPDElementTypesJob(context).doWork() if (!success) { FirebaseAnalytics.getInstance(context).logEvent(AnalyticsEvents.Sync.SYNC_UPD_ELEMENTTYPES_ERROR, Bundle()) Log.e("SYNC", "SCHDataUpdateJob UPDElementTypesJob error") } FirebaseAnalytics.getInstance(context).logEvent(AnalyticsEvents.Sync.SYNC_SCH_UPDATE_FINISH, Bundle()) val dataUpdateWorkRequest = OneTimeWorkRequestBuilder<SCHDataUpdateJob>() .setInitialDelay(JobOrganizer.WORK_INTERVAL, TimeUnit.MINUTES) .addTag(JobOrganizer.SCH_DATA_UPDATE_WORK) .setConstraints(JobOrganizer.wifiConstraint) .build() WorkManager.getInstance(applicationContext) .enqueue(dataUpdateWorkRequest) Log.e("SYNC", "SCHDataUpdateJob finished") return Result.success() } }
这是调用scheduleJobs()的片段。
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { super.onCreateView(inflater, container, savedInstanceState) mainView = inflater.inflate(R.layout.fragment_draft_list, container, false) sync = mainView!!.findViewById(R.id.sync) sync.onClick { mFirebaseAnalytics!!.logEvent(AnalyticsEvents.UPDATE_BUTTON_CLICKED, Bundle()) if (!ConnectionUtils.isConnectedToWifi(activity!!.applicationContext)) { showConnectivityDialog() } else { sync.visibility = View.GONE doAsync { JobOrganizer.scheduleJobs(context!!) } } } if (forceDownload) { JobOrganizer.scheduleJobs(context!!) } return mainView!! }
在某些时候,最后一项作业没有计划或没有运行。有任何线索吗?
谢谢。
我在重新安排作业时遇到了WorkManager的问题。目前,我发现在使用Okhttp启动请求并在AuthInterceptor上引发错误后的某个时刻,它卡住了...
在这里您可以学习如何使用工作管理器。