如何在 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)

您应该只将 contextworkerParameters 注释为 @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" />