主线程上的空间无效方法

时间:2018-10-08 03:49:53

标签: android-room

在使用适用于Android的Room库时,文档明确指出,除非明确允许,否则我们无法在主线程上进行调用。我很好奇的是返回类型为void的方法。返回LiveData会自动在主线程上运行它们,但void类型不会(除非我缺少某些东西),这似乎很愚蠢。有什么简便的方法可以不必在自己的托管线程中运行此代码?

我的查询

@Dao
interface UserDao {
    @Query("DELETE FROM users")
    fun clear()
}

我什至尝试使用Kotlin反射+扩展功能,但这似乎在运行时失败:

fun KFunction<Unit>.execOn(executor: Executor, vararg args: Any?) {
    executor.execute {
        this.call(args)
    }
}

然后拨打电话,例如:

myDb.userDao()::clear.execOn(diskExecutor)

注意起作用的是:

diskExecutor.execute {
    myDb.userDao().clear()
}

1 个答案:

答案 0 :(得分:0)

  

返回LiveData会自动在主线程中运行它们,但无效类型不会(除非我丢失了某些东西)似乎很愚蠢。

如果没有某种注释,Room不会知道您希望在后台线程上运行void返回DAO方法。对于被动返回类型(例如LiveDataSingle),您明确要求后台执行,因此不需要其他元数据(例如注释)。

您可能会考虑针对这种基于注释的方法提出功能请求。

  

是否有任何简便的方法可以执行此操作而不必在自己的托管线程中运行它?

如果您问“ Room是否有DAO方法(除具有反应性返回类型的方法以外的其他方法)有后台执行选项?”,答案是肯定的,至少在目前是这样。