簡體   English   中英

WorkManager-@HiltWorkManager

[英]WorkManager - @HiltWorkManager

我有視圖模型:

@HiltViewModel
class SplashViewMode @Inject constructor(
    private val repository: DataStoreRepository,
    private val workManager: PeriodicNotificationWorkManager
) : ViewModel() {

    init {
        workManager.startPeriodicNotifications()
    }
}

和一個 class 開始我的定期工作

class PeriodicNotificationWorkManager @Inject constructor(
    private val context: Context,
    private val workManager: WorkManager
) {
    private val WORK_TAG = "my_work"
    private val repeatInterval = 15L
    private val repeatIntervalTimeUnit: TimeUnit = TimeUnit.MINUTES

    fun startPeriodicNotifications() {
        val workRequest = PeriodicWorkRequestBuilder<ShowNotificationWorker>(
            repeatInterval,
            repeatIntervalTimeUnit
        )
            .addTag(WORK_TAG)
            .build()

        workManager.enqueueUniquePeriodicWork(
            WORK_TAG,
            ExistingPeriodicWorkPolicy.KEEP,
            workRequest
        )
    }
}

最后是我的工人:

@HiltWorker
class ShowNotificationWorker @AssistedInject constructor(
    @Assisted val context: Context,
    @Assisted val workerParams: WorkerParameters,
    //private val evenDao: EventDao
) :
    CoroutineWorker(context, workerParams) {
    override suspend fun doWork(): Result {
        NotificationDisplayer(context).showNotification("Test")
        return Result.success()
    }
}

到目前為止它工作正常。 但是我需要訪問 EventDao,所以如果我在上一個文件中取消注釋“private val evenDao: EventDao”,我會得到:

2022-12-31 12:22:03.314 6789-6936/com.rachapps.botanica E/WM-WorkerFactory: Could not instantiate com.rachapps.notification_feature.ShowNotificationWorker
    java.lang.NoSuchMethodException: com.rachapps.notification_feature.ShowNotificationWorker.<init> [class android.content.Context, class androidx.work.WorkerParameters]

BrianM 提供的解決方案終於為我工作了https://github.com/google/dagger/issues/2601

@Module
@InstallIn(SingletonComponent::class)
object WorkManagerInitializer: Initializer<WorkManager> {
  @Provides
  @Singleton
  override fun create(@ApplicationContext context: Context): WorkManager {
    val entryPoint = EntryPointAccessors.fromApplication(
      context,
      WorkManagerInitializerEntryPoint::class.java
    )
    val configuration = Configuration
      .Builder()
      .setWorkerFactory(entryPoint.hiltWorkerFactory())
      .setMinimumLoggingLevel(if (BuildConfig.DEBUG) Log.DEBUG else Log.INFO)
      .build()

    WorkManager.initialize(context, configuration)
    return WorkManager.getInstance(context)
  }

  override fun dependencies(): MutableList<Class<out Initializer<*>>> {
    return mutableListOf()
  }

  @InstallIn(SingletonComponent::class)
  @EntryPoint
  interface WorkManagerInitializerEntryPoint {
    fun hiltWorkerFactory(): HiltWorkerFactory
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM