EventBus:每个线程模式之间有什么不同?

时间:2015-06-01 20:22:56

标签: android multithreading android-asynctask event-bus

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

  
      
  • onEvent()

         
        
    • PostThread
    •   
    • 适合简单的任务
    •   
  •   
  • onEventMainThread()

         
        
    • MainThread
    •   
    • a.k.a。 UI线程
    •   
    • 适合用户界面更改
    •   
  •   
  • onEventBackgroundThread()

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

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

问题

  1. onEventBackgroundThread()使用onEventAsync()之前我应该​​检查哪些标准,反之亦然?使用一个优于另一个具有明显优势的一些例子是什么?

  2. 以下各项功能应使用哪种线程模式?

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

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

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

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

1 个答案:

答案 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()来处理。这也将为您提供确保序列化操作的优势。