如何在 workManager 中发出 API 请求?
how to make an API request inside workManager?
我正在尝试使用 WorkManager 定期从 API 检索通知计数,问题是我正在使用 hilt 进行依赖项注入,因此我无法将我的存储库注入“ @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)
您应该只将 context
和 workerParameters
注释为 @Assisted
。您的所有其他依赖项均由 Hilt 解决,它们必须安装在 SingletonComponent
中或未限定范围。
然后将 HiltWorkerFactory
注入到你的主要 Application
派生的 class 并使这个 class 像这样实现 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" />
我正在尝试使用 WorkManager 定期从 API 检索通知计数,问题是我正在使用 hilt 进行依赖项注入,因此我无法将我的存储库注入“ @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)
您应该只将 context
和 workerParameters
注释为 @Assisted
。您的所有其他依赖项均由 Hilt 解决,它们必须安装在 SingletonComponent
中或未限定范围。
然后将 HiltWorkerFactory
注入到你的主要 Application
派生的 class 并使这个 class 像这样实现 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" />