其他分享
首页 > 其他分享> > android-EventBus:每个线程模式之间有什么区别?

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