3

根据EventBus doc,有 4 种类型的线程模式EventBus用于传递线程:

  • onEvent()

    • 帖子线程
    • 适合简单的任务
  • onEventMainThread()

    • 主线程
    • 又名 UI 线程
    • 适合 UI 更改
  • onEventBackgroundThread()

    • 背景踏板
    • 使用单线程,按顺序传递事件。
    • 适合需要适度时间的执行。
  • onEventAsync()

    • 异步
    • 使用单独的线程。
    • 适合需要较长时间的执行

问题

  1. onEventBackgroundThread()在使用over之前,我应该检查哪些标准onEventAsync(),反之亦然?有哪些使用其中一种具有明显优势的例子?

  2. 以下每个函数应使用哪种线程模式?

    • 获取设备状态——设备的 GPS 位置(即android.location),互联网连接状态(即ConnectivityManagerNetworkInfo)。

    • 发出简单的 HTTP 请求来接收文本(例如 JSON),需要 1000 毫秒到 5000 毫秒之间的任何时间,平均 2000 毫秒。

    • 发出简单的 HTTP 请求以加载文件大小在 50kb 到 1500kb 之间的图像(在向服务器发出请求之前,客户端不知道确切的大小)。

    • 将数据缓存到内部数据库(例如SharedPreferencesSQLite等)。

4

1 回答 1

4

在使用 onEventBackgroundThread() 而不是 onEventAsync() 之前,我应该检查哪些标准,反之亦然?有哪些使用其中一种具有明显优势的例子?

嗯,这和子弹的轮廓差不多。如果您不介意排队、一次处理(或者您可能希望它更简单的线程安全),请使用onEventBackgroundThread(). 如果您需要并行执行其中的几个,特别是如果它们是 I/O 绑定的,您将使用onEventAsync().

以下每个函数应使用哪种线程模式?

设备的 GPS 位置(即 android.location)

以上都不是。LocationManager并且融合位置 API 有自己的异步选项;我会用那些。将位置交给您后,您可以发布带有位置数据的事件,但是线程由该事件的订阅者决定,而不是发布者。

Internet 连接状态(即 ConnectivityManager、NetworkInfo)

以上都不是,因为 AFAIKgetNetworkInfo()不是一个昂贵的电话。

发出简单的 HTTP 请求来接收文本(例如 JSON),需要 1000 毫秒到 5000 毫秒之间的任何时间,平均 2000 毫秒。

以上都不是。我会使用 Retrofit 或其他提供异步选项的 HTTP 客户端库。如果出于某种原因您必须自己进行 HTTP I/O,这将取决于这种情况发生的频率。例如,如果您可能因为快速连续启动其中几个而落后,请使用onEventAsync()它们以便它们可以并行运行。

发出简单的 HTTP 请求以加载文件大小在 50kb 到 1500kb 之间的图像(在向服务器发出请求之前,客户端不知道确切的大小)。

以上都不是。使用 Picasso、Universal Image Loader 或任何其他图像加载库,因为它们都具有异步选项,并且无论如何您确实需要这些用于图像处理逻辑。如果出于某种原因您绝对必须自己进行 HTTP I/O,它会遵循我在前一项中描述的相同规则。

将数据缓存到内部数据库(例如 SharedPreferences、SQLite 等)。

假设您在这里没有使用一些可能提供异步操作的包装库,这可能可以通过onEventBackgroundThread(). 这也将为您提供确保序列化操作的优势。

于 2015-06-01T20:42:55.167 回答