包含 Handler 的吸气剂

Posted

技术标签:

【中文标题】包含 Handler 的吸气剂【英文标题】:Getters incorporating Handler 【发布时间】:2021-11-05 01:00:00 【问题描述】:

像 ExoPlayer 这样的库要求对它的所有调用都在主线程上。在这种情况下,我有一个从 ExoPlayer 获取属性的 getter,但它应该来自主线程。

我尝试使用Handler,但是没有办法等待它......

    val currentTrackIndex: Int
        get() 
            var result = -1

            handler.post 
                result = exoPlayer.currentIndex
            

            return result
        

...结果总是-1。

我发现唯一可行的方法是使用runBlocking。但是,这似乎不应该用于生产:

val currentTrackIndex: Int
    get() 
        return runBlocking 
            return@runBlocking exoPlayer.currentIndex
        
    

有没有更好的方法来阻塞 getter 中的主线程?

注意:所有这些调用都在 Service 中。

注意 2:即使我需要阻塞主线程(这可能会引发危险信号),获取属性也是尽可能即时的。 ExoPlayer 的运作方式很奇怪。

【问题讨论】:

为什么不能使用回调? 【参考方案1】:

创建一个应用程序类,在其中创建一个静态 Context 字段,然后在您的 Handler 中使用Context.getMainLooper(),我认为它会解决您的问题。

【讨论】:

以上是关于包含 Handler 的吸气剂的主要内容,如果未能解决你的问题,请参考以下文章

了解 Nuxt.js 中的状态和吸气剂:吸气剂不起作用

类内的吸气剂模式?

Vuex:为啥我们用大写字母编写突变、动作和吸气剂?

吸气剂'loadingStatus'在空颤时被调用

如何使用带有可空值的吸气剂?

没有为“FirebaseUser”类定义吸气剂“实例”