在我与同事一起开发的当前应用程序中,我们使用IntentServices和Volley调用来处理RESTful API网络请求。它只是简单的JSON字符串数据和一些小图像。
我对那些处理网络请求的人提出的问题是:在那里实施更合适或更清洁的东西吗?
据我所知,使用IntentService的优势在于它在主线程的后台运行,并且通常是Android操作系统杀死的最后一件事。缺点是IntentServices按顺序运行。
我一直在阅读很多关于RxJava和Retrofit的内容,并且觉得我们的需求可以通过这种组合得到更好的服务。改造本身就足够了,但我真的很感激第三方的见解。
答案 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调用。