- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
根据 EventBus doc ,EventBus
用来传递线程的线程模式有4种:
onEvent()
- PostThread
- Good for simple tasks
onEventMainThread()
- MainThread
- a.k.a. UI Thread
- Good for UI changes
onEventBackgroundThread()
- BackgroundTread
- Using single thread, delivering events sequentially.
- Good for execution requiring moderate amount of time.
onEventAsync()
- Async
- Using separate threads.
- Good for execution requiring longer time
在使用 onEventBackgroundThread()
而不是 onEventAsync()
之前,我应该检查哪些标准,反之亦然?使用一个比另一个具有明显优势的例子有哪些?
以下每个函数应使用哪种线程模式?
获取设备状态 -- 设备的 GPS 位置(即 android.location
)、互联网连接状态(即 ConnectivityManager
、NetworkInfo
).
发出简单的 HTTP 请求以接收文本(例如 JSON),耗时 1000 毫秒到 5000 毫秒之间,平均 2000 毫秒。
发出简单的 HTTP 请求以加载文件大小在 50kb 到 1500kb 之间的图像(在向服务器发出请求之前,客户端不知道确切大小)。
将数据缓存到内部数据库(例如 SharedPreferences
、SQLite
等)。
最佳答案
What are some criteria I should examine before I use onEventBackgroundThread() over onEventAsync(), or vice versa? What would be some examples of using one over the other with obvious advantages?
好吧,这与项目符号概述的差不多。如果您不介意排队、一次一个处理(或者您想要它以实现更简单的线程安全),请使用 onEventBackgroundThread()
。如果您需要并行执行其中的几个,特别是如果它们受 I/O 限制,您可以使用 onEventAsync()
。
Which thread modes should each of the following functions use?
GPS location of the device (i.e. android.location)
以上都不是。 LocationManager
和融合位置 API 有自己的异步选项;我会用那些。获得传递给您的位置后,您可以发布带有位置数据的事件,但线程由该事件的订阅者而不是发布者决定。
Internet connectivity status (i.e. ConnectivityManager, NetworkInfo)
以上都不是,因为 AFAIK getNetworkInfo()
不是一个昂贵的调用。
Making simple HTTP requests to receive text (e.g. JSON), taking anywhere between 1000ms to 5000ms, average 2000ms.
以上都不是。我会使用 Retrofit 或其他提供异步选项的 HTTP 客户端库。如果出于某种原因您绝对必须自己执行 HTTP I/O,那将取决于这种情况发生的频率。例如,如果您可能因为快速连续触发其中的几个而落后,请使用 onEventAsync()
以便它们可以并行运行。
Making simple HTTP requests to load images with file sizes between 50kb to 1500kb (exact sizes are unknown to client, before making requests to server).
以上都不是。使用 Picasso、Universal Image Loader 或任何其他图像加载库,因为它们都有异步选项,而且图像处理逻辑确实需要这些。如果出于某种原因您绝对必须自己执行 HTTP I/O,它会遵循我在上一项中描述的相同规则。
Caching data to internal database (e.g. SharedPreferences, SQLite, etc).
假设您在这里没有使用一些可能提供异步操作的包装器库,这可能可以通过 onEventBackgroundThread()
来处理。这也将为您提供确保序列化操作的优势。
关于android - 事件总线 : What are some differences among each thread modes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30582596/
目录 总线是什么? 常见总线类型有哪些? 总线的串行和并行的区别? 数据总线 地址总线
从下面的代码我在 map 上添加标记,每 15 秒刷新一次并从数据库中获取新的纬度和经度。标记(巴士图像)已成功添加到 map 上并从一个位置平稳移动到另一个位置,就像汽车在路上行驶一样。现在我想要的
如果在小端处理器上运行的程序将未缓存的值 0xaabbccdd 写入地址 0,并且处理器使用 32 位宽的 AXI4 总线,那么 WDATA 的第 31-24 位是 0xaa 还是 0xdd? AXI
是否存在用于将进程内服务消息传递给另一个服务的扭曲机制?我写了一个原型(prototype)总线,看起来像 from collections import defaultdict ch
我修改了设备树文件并使用 4 个 GPIO 引脚启用了 spi,这些引脚支持 pinmux 并从 gpio 切换到 spi 功能。但是在 Linux 内核代码中,代码如何知道使用了哪个 spi 总线/
我正在使用控创嵌入式计算机通过 I2C 与 ST 微 Controller 通信。我正在使用开发适配器与 I2C 接口(interface),使用描述的简单 read() 和 write() 函数 h
我有一个需要 PEC 的 I2C/SMBus 设备我正在为它编写一个内核空间驱动程序。 在 Linux 2.6.37 上我使用 i2c_board_info实例化客户端并在那里设置标志,但现在驱动程序
我想确认我的消息已经通过 socketCAN 库保存在 CAN 总线上。socketCAN 文档描述了使用 recvmsg() 函数时的这种可能性,我对其实现有疑问。 我要实现的功能是确认我的消息在仲
下面是我的代码 #import #import int main(int argc, const char *argv[]) { char *str = "First string";
在大量使用 D-Bus 的应用程序中获得更好的时间性能有哪些好的做法? ? 以下是我们的团队通过硬敲学校学到的一些知识: 尝试将数据实体组合成一个单一的大型结构/对象,以通过 D-Bus IPC 发送
我正在Akka内核下运行Akka应用程序,该程序在其他系统上也可以正常工作。 akka { loggers = ["akka.event.slf4j.Slf4jLogger"] log
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我是 C 语言新手,对于家庭作业考试,我必须实现一个简单的服务器套接字程序,该程序在循环中发送一些数据,并且如果客户端连接到服务器套接字(已使用 Arduino 完成,但需要相同的功能)在 raspb
我正在构建一个由许多(> 100)个相同节点组成的系统,所有节点均通过 CAN 总线连接。这个想法是所有节点必须具有相同的信息,任何节点都可以生成事件并通过 CAN 广播它。对于这些事件,CAN 帧提
您好,我在解析 IIB Toolkit 中的任何 JSON 时遇到问题。 java计算节点抛出的异常为:java.lang.NoClassDefFoundError: org.json.JSONObj
我买了这个传感器: http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Sensors/Weather/RHT03.pdf 输出为“MaxDetect 1-w
我正在用户空间编写包装器 API,用于在嵌入式 Linux 平台上用 C 语言控制 I2C 总线。我能够使用 read() 和 write() 方法以及 ioctl() 调用来选择从属设备,从而从传感
在我的软件(用 C++ 编写)中,我使用 Linux 标准函数打开 CAN 总线套接字并执行 I/O 操作。 套接字的打开和使用如下: /* Create the socket */ if ((
每天——大约 5 到 10 次——我的 USB 摄像头从系统中消失。它从第一天开始就发生了,因为制造商驱动程序与 Linux 不兼容。 lsusb 和 dmesg 一开始正确显示,但在较长时间后有时会
我分发了包含多个 Go 服务的应用程序。其中一些使用 Kafka 作为数据总线。我能够使用 Jaeger 的 opentracing 追踪服务之间的调用。我在图表上绘制 Kafka 跨度时遇到问题,它
我是一名优秀的程序员,十分优秀!