android-EventBus:每个线程模式之间有什么区别?
作者:互联网
根据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
题
>在onEventAsync()上使用onEventBackgroundThread()之前,应检查哪些条件,反之亦然?在优势明显的情况下,一个又一个地使用示例会是什么?
>以下每个功能应使用哪种线程模式?
>获取设备状态-设备的GPS位置(即android.location),互联网连接状态(即ConnectivityManager,NetworkInfo).
>进行简单的HTTP请求以接收文本(例如JSON),耗时介于1000毫秒至5000毫秒之间,平均为2000毫秒.
>发出简单的HTTP请求以加载文件大小在50 kb至1500 kb之间的图像(在向服务器发出请求之前,客户端不知道确切的大小).
>将数据缓存到内部数据库(例如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()处理此包装器.这也将为您提供确保序列化操作的优势.
标签:event-bus,multithreading,android-asynctask,android 来源: https://codeday.me/bug/20191028/1951092.html