我正在构建一个需要检测照片中某些对象的应用程序。我首先将所有要检查的照片加载并保存到我的房间数据库中,并使用ViewHolder将其连接到我的视图。 当用户单击按钮时,我希望检测过程开始,并且我想为此使用jobIntentService(因为那里可能有数千张照片)。
我的问题是-如何从服务中访问viewHolder?我既需要它来实际获取文件的全部,也需要在检测到所有文件后更新它们的记录。 我尝试将活动作为属性之一,但出现此错误
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
感谢您的任何投入,谢谢
答案 0 :(得分:0)
ViewModel对于活动和片段特别重要(例如,它们在配置更改期间保留数据)。因此,服务并不是真的需要它。因此,您可以通过以下两种方法之一解决此问题。
方法1:
如果您的MyViewModel
只是用于从LiveData
类访问Repository
的包装器,那么您就可以在服务中使用您的Repository类。
方法2:
如果ViewModel所做的不只是包装对Repository的调用,并且您希望Service类能够访问ViewModel中定义的相同逻辑,请使用中间ViewModelContent类。而不是将所有内容都放在MyViewModel类中,而是将它们放在“ ViewModelContent”类中。然后将MyViewModel类用作ViewModelContent的访问器包装。然后,您的Service可以像任何其他类一样实例化ViewModelContent。
class MyViewModel(application: Application) : AndroidViewModel(application) {
init{
viewModelContent = ViewModelContent(...)
}
}
方法1 通常比方法2 更干净。