0

我正在构建一个需要检测照片中某些对象的应用程序。我首先将所有要检查的照片加载并保存到我的房间数据库中,并使用 ViewHolder 将其连接到我的视图。当用户单击一个按钮时,我希望开始检测过程,并且我想为此使用 jobIntentService(因为那里可能有数千张照片)。

我的问题是 - 我如何从服务中访问视图持有者?我需要它来实际获取文件,并且一旦检测到,我就可以更新每个文件的记录。我试图将活动作为属性之一,但我收到此错误

Unable to instantiate service tech.levanter.anyvision.services.DetectJobIntentService: java.lang.InstantiationException: java.lang.Class<tech.levanter.anyvision.services.DetectJobIntentService> has no zero argument constructor

将不胜感激任何输入,谢谢

4

1 回答 1

0

ViewModel 对活动和片段具有特殊意义(例如,它们在配置更改期间保留数据)。所以服务并不真正需要它。因此,您可以通过以下两种方式之一解决问题。

方法一:

如果你MyViewModel只是一个LiveData从你的Repository类访问的包装器,那么你可以在你的服务中使用你的 Repository 类。

方法二:

如果您的 ViewModel 不仅仅是包装对 Repository 的调用,并且您希望您的 Service 类能够访问 ViewModel 中定义的相同逻辑,那么请使用中间 ViewModelContent 类。不要将所有内容都放在 MyViewModel 类中,而是将它们放在“ViewModelContent”类中。然后使用您的 MyViewModel 类作为 ViewModelContent 的访问器包装器。然后,您的 Service 可以像实例化任何其他类一样实例化 ViewModelContent。

class MyViewModel(application: Application) : AndroidViewModel(application) {
   init{
      viewModelContent = ViewModelContent(...) 
   }
}

方法 1通常比方法 2更干净。

于 2019-11-13T17:46:17.143 回答