根据EventBus doc,EventBus
用于传递线程的线程模式有4种类型:
onEvent()
- PostThread
- 适合简单的任务
onEventMainThread()
- MainThread
- a.k.a。 UI线程
- 适合用户界面更改
onEventBackgroundThread()
- BackgroundTread
- 使用单线程,按顺序传递事件。
- 适合执行,需要适度的时间。
onEventAsync()
- 异步
- 使用单独的线程。
- 适合需要更长时间的执行
在onEventBackgroundThread()
使用onEventAsync()
之前我应该检查哪些标准,反之亦然?使用一个优于另一个具有明显优势的一些例子是什么?
以下各项功能应使用哪种线程模式?
获取设备状态 - 设备的GPS位置(即android.location
),互联网连接状态(即ConnectivityManager
,NetworkInfo
)。
发出简单的HTTP请求来接收文本(例如JSON),需要1000毫秒到5000毫秒,平均2000毫秒。
制作简单的HTTP请求,以加载文件大小在50kb到1500kb之间的图像(在向服务器发出请求之前,客户端不知道确切的大小)。
将数据缓存到内部数据库(例如SharedPreferences
,SQLite
等)。
答案 0 :(得分:4)
在onEventAsync()上使用onEventBackgroundThread()之前我应该检查一些标准,反之亦然?使用一个优于另一个具有明显优势的一些例子是什么?
嗯,就像子弹的轮廓一样。如果您不介意排队,一次一个处理(或者您想要它以获得更简单的线程安全性),请使用onEventBackgroundThread()
。如果你需要并行执行其中几个,特别是如果它们受I / O约束,你可以使用onEventAsync()
。
以下各项功能应使用哪种线程模式?
设备的GPS位置(即android.location)
以上都不是。 LocationManager
和融合位置API有自己的异步选项;我会用那些。获得递送给您的位置后,您可以发布包含位置数据的事件,但线程由该事件的订阅者决定,而不是海报。
Internet连接状态(即ConnectivityManager,NetworkInfo)
以上都不是,因为AFAIK getNetworkInfo()
并不是一个昂贵的电话。
制作简单的HTTP请求以接收文本(例如JSON),占用时间在1000毫秒到5000毫秒之间,平均为2000毫秒。
以上都不是。我使用Retrofit或其他提供异步选项的HTTP客户端库。如果由于某种原因你绝对必须自己做HTTP I / O,那将取决于这种情况发生的频率。例如,如果您可能因为快速连续发射其中的几个而落后,请使用onEventAsync()
以便它们可以并行运行。
制作简单的HTTP请求以加载文件大小在50kb到1500kb之间的图像(在向服务器发出请求之前,客户端不知道具体的大小)。
以上都不是。使用Picasso,Universal Image Loader或任何其他图像加载库,因为它们都具有异步选项,并且您无论如何都需要它们用于图像处理逻辑。如果由于某种原因你必须自己完成HTTP I / O,它将遵循我对前一项所描述的相同规则。
将数据缓存到内部数据库(例如SharedPreferences,SQLite等)。
假设你没有在这里使用一些可能提供异步操作的包装器库,这可能可以通过onEventBackgroundThread()
来处理。这也将为您提供确保序列化操作的优势。