如何将房间实例传递给 JobService?

Posted

技术标签:

【中文标题】如何将房间实例传递给 JobService?【英文标题】:How to pass room instance to JobService? 【发布时间】:2020-11-14 04:15:50 【问题描述】:

为了在 JobScheduler 中将某些参数保存到本地,我在 JobService 下面实现了,

class MyJobService : JobService() 

  private var context = applicationContext

  private var db = Room.databaseBuilder(
    context, // ERROR
    AppDatabase::class.java, "database-name"
  ).build()

  override fun onStopJob(params: JobParameters?): Boolean 
    ... 
  

  override fun onStartJob(params: JobParameters?): Boolean 
    // use db
    ...
  

applicationContext 无法使用以下错误消息,

Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference

所以我正在尝试另一种方式,将房间实例传递给 JobInfo 中的 MyJobService,

val job = JobInfo.Builder(
   MY_BACKGROUND_JOB,
   ComponentName(context, MyJobService::class.java) // seems to can not passing any arguments for constructor
)
.build()

但在Class<?>,似乎无法传递参数。

onStartJob中的房间实例如何使用?

【问题讨论】:

已解决:***.com/questions/21994612/… 这不是一个优雅的解决方案!您不应该到处传递上下文,而是到处创建 Room 实例。 【参考方案1】:

您应该创建一个 (f.e.)Repository 类来处理与 Room 的所有交互。在您的应用程序中创建一个单例。

那么你只需要通过((MainApp) getApplication()).getRepository()获取就可以了

在official Android examples Github 上找到一个非常好的示例!

【讨论】:

感谢您的回答!!

以上是关于如何将房间实例传递给 JobService?的主要内容,如果未能解决你的问题,请参考以下文章

如何从扩展 JobService 的类中调用将视图作为参数的 MainActivity 方法?

如何使用 CloudFormation 将 UserData 传递给 Beanstalk 实例

PHP:如何将实例变量传递给闭包?

如何将实例成员的默认参数值传递给方法?

如何将实例成员的默认参数值传递给方法?

如何将类实例传递给 LowLevelMouseProc?