目标
如何将myObject和myClass参数传递给下面的GlanceWorker?
背景
我正在使用android-workmanager运行后台任务。这些任务是从我用一瞥添加的主屏幕小部件初始化的。正如Google 这里所建议的(请参阅“如何获取数据?”)我使用工作人员来更新从ActionCallback启动的Glance。
要更新我的小部件,工作构造函数需要有两个额外的参数myObject和myClass (除了context和workerParameters)。到目前为止,我所读到的所有例子都提到了使用WorkerFactory来实现这一点。这个额外的参数总是在启动时提供给工厂或通过匕首图注入。
但是,在我的例子中,这些额外参数的类型取决于创建ActionCallback的小部件(每个小部件都有自己的GlanceStateDefinition()和GlanceAppWidget()扩展)。因此,我只能在运行时向工作人员提供额外的参数(据我所知),并且不知道如何将其预先提供给自定义WorkerFactory。为了使它更加复杂,我的一个额外参数使用了一个通用的T。
abstract class Action<T : ShowPortfolioMenuState<T>>(
val myObject: GlanceStateDefinition<T>,
val myClass: Class<out WidgetAbstractClass>,
) : ActionCallback {
override suspend fun onAction(
context: Context,
glanceId: GlanceId,
parameters: ActionParameters,
) {
val glanceIdInt = GlanceAppWidgetManager(context).getAppWidgetId(glanceId)
val showMenu = parameters[ActionParameters.Key("showMenu")] ?: false
val glanceWork =
OneTimeWorkRequest.Builder(GlanceWorkerPortfolioChange::class.java)
.setInputData(
workDataOf("GLANCE_ID" to glanceIdInt, "SHOW_MENU" to showMenu)
).build()
WorkManager.getInstance(context)
.beginUniqueWork("Worker Name",
ExistingWorkPolicy.REPLACE,
glanceWork
).enqueue()
}
}@HiltWorker
class GlanceWorker<T: ShowMenuState<T>> @AssistedInject constructor(
@Assisted val context: Context,
@Assisted workerParameters: WorkerParameters,
val myObject: GlanceStateDefinition<T>, /*<--- how do i add to constructor*/
val myClass: Class<out WidgetAbstractClass>, /*<--- how do i add to constructor*/
): CoroutineWorker(context, workerParameters) {
override suspend fun doWork(): Result {
val glanceIdInt = inputData.getInt("GLANCE_ID", -1)
val glanceId = GlanceAppWidgetManager(context).getGlanceIdBy(glanceIdInt)
val showMenu = inputData.getBoolean("SHOW_MENU", false)
myClass.apply {
updateAppWidgetState(context, myObject, glanceId) { state -> /*state is of type T*/
state.updateShowMenu(showMenu)
}
update(context, glanceId)
}
return Result.success()
}
}发布于 2022-11-15 09:20:08
几件事:
Class.forName(..)获取类型/实例。workData传递给工作人员,从而对它进行同样的操作。一些工人的例子:
https://stackoverflow.com/questions/74438401
复制相似问题