android - Scala Actor 线程控制

标签 android scala actor

我想知道更多关于控制每个 Scala actor 运行位置的可能性的信息。我碰巧遇到了一个有点特殊的情况:需要高 react 性,代码的很大一部分是时间关键的,最糟糕的是,我在 Android 上。考虑到这一点,我的主要目标是:使代码尽可能易读和直接。

理想情况下我想要实现的目标(其中一些起初听起来不合理/彻头彻尾的愚蠢,请阅读下面的基本原理)
- 我希望能够在某个特定的、始终相同的任意线程中响应某些消息,但我不需要阻塞它来等待消息。
- 我希望我的大部分处理都在工作线程池上完成,理想情况下是自动调整大小作为 Scala actors 支持,同时保证此处理永远不会发生在上面的任意线程上。

这些要求源于 Android 的必要性:Android 框架使用一个特殊的线程来触摸 UI,如果你从另一个线程触摸任何 UI 对象,你会得到一个异常。通过这种方式,它强制执行某种线程/锁定模型,这正是我正在尝试解决的问题。但无论如何,事情就是这样:我必须确保我的一些处理,即处理 UI 对象的处理,正在这个线程上运行,而不是其他线程,因为框架烦人地说这就是我应该做的。 一个烦人的副作用是只要这个线程正在处理我的代码,UI 就会停止更新,我的应用程序也会停止响应。因此,我需要确保该线程不会随机选择我可能在某些 React{} 中拥有的长时间运行的代码,并且理想情况下,它永远不会处理可能由另一个线程完成的事情。

android 框架提供了一个名为 Handle 的类,它实现了某种消息传递——您向它发送一个 Runnable,它就会在 UI 线程上运行。如果需要,我可以使用它。每次都创建一个 Runnable 会使代码变得非常困惑——可以做的一件事是将它封装在某种方法中,这样我就可以编写类似
的东西 onUIThread {/* 一些代码 */}
...这比 new Runnable() { def run () {}} 好得多。另一方面,这基本上就是 onUIThread 函数要做的事情,所以我将创建两个闭包——然后我必须处理闭包的内存分配细节。我必须这样做,因为每次我分配一个对象时,GC 都有机会运行,而在 Android 上,这通常是 150 毫秒的执行暂停,如果它发生在关键的执行路径中,这将破坏我的用户体验。

所以最后:
- 我是否有任何方法可以将 actor 与线程静态关联,以便我可以拥有一个 UI actor,在其中使用react{}并始终在 UI 线程上运行其代码?/* 我知道它本身就是一个糟糕的设计,请阅读上面的基本原理以了解为什么我无能为力 */
- 我是否有任何方法可以确保永远不会考虑将此特定线程用于响应 react{} 中的消息? - 关于我可以做什么的任何建议,考虑到我的限制,以获得更好的代码易读性?

最佳答案

您可以通过扩展将任务推送到 ui 线程的 IScheduler 特性来实现客户调度程序,然后覆盖需要在 ui 线程上运行的 actor 上的调度程序方法。

不久前有人用 Swing 尝试过这个,我认为它有效: http://scala-programming-language.1934581.n4.nabble.com/scala-Swing-event-thread-actors-td1987246.html

然后让其他 Actor 使用正常的调度程序。

但我要指出,react {} 会导致创建一个最终包含在可运行对象中的闭包。它还使用异常进行流量控制,这引入了相当大的开销(我不知道在 Dalvik 上有多少)。因此,如果 GC 关闭真的会损害您应用的性能,我怀疑 actors 是否会拯救您。

关于android - Scala Actor 线程控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3649095/

相关文章:

安卓蓝牙连接被拒绝

java - 从BroadcastReceiver获取通知标题(直接回复Android N)

scala - Scala中的隐式抽象类构造函数参数和继承

java - Akka官方教程: Parent actor doesn't receive termination message when child is stopped with PoisonPill

android - 在编辑文本中多次按零,但用户应该只能看到一位数字,如计算器

android - OpenGL (ES) -- glBindBuffer 抛出 IllegalArgumentException : remaining < size()

java - 在 Java/Scala 项目中检查 null 与匹配

scala - 基于spark中的模式匹配加载文件

java - 多线程的最佳替代方案是什么?

multithreading - 允许actor定期替换共享的不可变只读状态是 “ok”吗?