是否有任何开发模式可以替换网络请求的IntentService?

时间:2015-07-10 17:28:27

标签: android retrofit rx-java android-networking android-intentservice

在我与同事一起开发的当前应用程序中,我们使用IntentServices和Volley调用来处理RESTful API网络请求。它只是简单的JSON字符串数据和一些小图像。

我对那些处理网络请求的人提出的问题是:在那里实施更合适或更清洁的东西吗?

据我所知,使用IntentService的优势在于它在主线程的后台运行,并且通常是Android操作系统杀死的最后一件事。缺点是IntentServices按顺序运行。

我一直在阅读很多关于RxJava和Retrofit的内容,并且觉得我们的需求可以通过这种组合得到更好的服务。改造本身就足够了,但我真的很感激第三方的见解。

3 个答案:

答案 0 :(得分:22)

我的一般经验法则是:

  • 如果网络I / O应该在一秒之内,并且你不介意它没有运行完成,那么任何异步选项都应该没问题。

  • 如果网络I / O应该超过一秒,或者您确实希望增加运行完成的几率,请使用Service。您是否使用IntentService或其他Service实施方案取决于您,但您希望Service作为您正在运行的操作系统的指示器,因此它一旦您的应用程序移至后台,就不会非常快速地终止您的流程。请记住"移动到背景"并不总是由用户直接发起的事情,因为来电也会将你带到后台。

  • 如果网络I / O需要超过15秒,您不仅需要使用Service,还需要考虑WakeLock(通过我的{{} 1}},或WakefulIntentService,或您自己精心管理的WakefulBroadcastReceiver),可能还有WakeLock。 15秒是“设置”中的最小自动屏幕关闭时间段,这是该数字的来源。

考虑到所有这些:

  

缺点是IntentServices按顺序运行。

我将其翻译为" WifiLock有一个用于处理请求的线程"。这是真的。如果您需要IntentService并且需要并行处理,请创建自己的Service。当你没有出色的工作时,请务必致电Service

  

我已经阅读了很多关于RxJava和Retrofit的内容,感觉我们的需求可以通过这种组合得到更好的服务

这与您是否使用stopSelf()无关。只是不要尝试从Service执行异步内容(例如,使用Callback进行的Retrofit调用),因为你违背了IntentService的目的(向操作系统表明你正在做的工作)。因此,从IntentService开始,您将使用Retrofit的同步API,无法使用IntentService

答案 1 :(得分:0)

使用IntentServices只是为了执行一个简单的网络请求,IMO就是很多。你应该使用AsyncTask,如果你不想使用库,或者如果你更喜欢Retrofit,Volley ...(我建议使用Retrofit)。 IMO,服务,或者在这种情况下,IntentService旨在执行长时间的后台任务。

答案 2 :(得分:0)

真正的问题是:您是否加载数据以填充前景中的活动或进行后台工作,即使没有可见的UI?

对于后台工作,服务是可行的方法。如果您依赖于Volley的线程管理,您甚至不需要IntentService。

对于前台工作,请考虑直接在Activity / Fragment中使用Loaders或Volley或Rxjava调用。