如何在workManager中发出API请求?



我试图使用WorkManager定期从API检索通知计数,问题是我正在使用依赖注入的柄,因此我不能用"@Inject"注入我的存储库即使我使用了@AndroidEnteryPoint。以及如何在"dowork"中观察我检索到的数据函数。

class NotificationsCountWorker
(
val context: Context,
workerParams: WorkerParameters) :
CoroutineWorker(context, workerParams) {

@Inject lateinit var repo: RepositoryImpl


override suspend fun doWork(): Result {
Log.d(TAG, "doWork")
//subscribeObserver()
return try {
withContext(Dispatchers.IO) {
try {
Log.d(TAG, "inside with context")
repo.notificationsCount().onEach {
Log.d(TAG, "item; $it")
}.launchIn(this)
Log.d(TAG, "notif count ")
Result.success()
} catch (e: Exception){
Log.d(TAG, "exception ${e.message}")
Result.failure()
}
}
}catch (e:Exception){
Log.d(TAG, "exception ${e.message}")
Result.failure()
}

}

companion object {
private const val TAG = "NotificationsWorkManger"
const val NOTIFICATIONS_COUNT_WORK_MANGER_ID = "automatic_notifications_count_manger"
fun reminder() {
val periodicRefreshRequest = PeriodicWorkRequest.Builder(
NotificationsCountWorker::class.java, // Your worker class
15, // repeating interval
TimeUnit.MINUTES
)
val periodicWorkRequest: PeriodicWorkRequest = periodicRefreshRequest
.build()
WorkManager.getInstance(getApplication()).enqueueUniquePeriodicWork(
NOTIFICATIONS_COUNT_WORK_MANGER_ID,
ExistingPeriodicWorkPolicy.REPLACE,
periodicWorkRequest
)
}
}

}

需要通过构造函数注入依赖项。为了启用对带有Hilt的Worker的注入,你需要做以下几件事:

首先,像这样注释Worker、它的构造函数和构造函数参数:
@HiltWorker
class MyWorker @AssistedInject constructor(
@Assisted context: Context,
@Assisted workerParameters: WorkerParameters,
private val repository: Repository
) : CoroutineWorker(context, workerParameters)

您应该只将contextworkerParameters注释为@Assisted。所有其他依赖项都由Hilt解决,它们必须安装在SingletonComponent或取消作用域。

然后将HiltWorkerFactory注入到主Application派生类中,并使该类实现Configuration.Provider接口,如下所示:

@HiltAndroidApp
class MainApplication : Application(), Configuration.Provider {
@Inject
lateinit var workerFactory: HiltWorkerFactory
override fun getWorkManagerConfiguration() =
Configuration.Builder()
.setWorkerFactory(workerFactory)
.build()
}

最后一步是禁用默认WorkManager初始化。要做到这一点,如果你使用的是版本2.6.0-alpha01或更高版本的WorkManager,请将这些行插入AndroidManifest.xml:

<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<!-- If you are using androidx.startup to initialize other components -->
<meta-data
android:name="androidx.work.impl.WorkManagerInitializer"
android:value="androidx.startup"
tools:node="remove" />
</provider>

<!-- If you want to disable android.startup completely. -->
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
tools:node="remove">
</provider>

如果你使用的是旧版本,你应该加上:

<provider
android:name="androidx.work.impl.WorkManagerInitializer"
android:authorities="${applicationId}.workmanager-init"
tools:node="remove" />

最新更新