如何从服务中访问活动的ViewModel?

时间:2019-11-13 17:28:27

标签: android android-intent service android-service jobintentservice

我正在构建一个需要检测照片中某些对象的应用程序。我首先将所有要检查的照片加载并保存到我的房间数据库中,并使用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

感谢您的任何投入,谢谢

1 个答案:

答案 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 更干净。