在我与同事开发的当前应用程序中,我们在内部使用带有 Volley 调用的 IntentServices 来处理 RESTful API 网络请求。它只是简单的 JSON 字符串数据和一些小图像。
我想问那些在处理网络请求方面有经验的人的问题是:是否有更合适或更清洁的东西可以在那里实现?
据我所知,使用 IntentService 的优势在于它在主线程的后台运行,通常是 Android 操作系统最后杀死的东西之一。缺点是 IntentServices 是按顺序运行的。
我已经阅读了很多关于 RxJava 和 Retrofit 的文章,并且觉得这种组合可以更好地满足我们的需求。改造本身可能就足够了,但我非常感谢第三方的一些见解。
最佳答案
我的一般经验法则是:
如果网络 I/O 应该在一秒以内,并且您不介意它没有运行完成,那么任何异步选项都应该没问题。
如果网络 I/O 应该超过一秒,或者您真的想增加它运行完成的几率,请使用
服务
。您是使用IntentService
还是其他一些Service
实现取决于您,但您希望有一个Service
作为操作系统的指示器正在工作,因此一旦您的应用程序移至后台,它就不会很快终止您的进程。请记住,“移至后台”并不总是由用户直接启动,因为来电等也会将您移至后台。如果网络 I/O 将花费超过 15 秒,您不仅需要使用
Service
,还需要考虑WakeLock
(通过我的WakefulIntentService
,或WakefulBroadcastReceiver
,或您自己精心管理的WakeLock
)和可能的WifiLock
。 15 秒是“设置”中的最短自动屏幕关闭时间,这也是该数字的来源。
考虑到所有这些:
The downside being that IntentServices are run sequentially.
我将其翻译为“IntentService
有一个用于处理请求的线程”。这是真实的。如果您需要 Service
并且需要并行处理,请创建您自己的 Service
。当您没有未完成的工作时,请务必调用 stopSelf()
。
I've been reading a lot about RxJava, and Retrofit, and feel like our needs could be better served with that combination
这与您是否使用服务
无关。只是不要尝试从 IntentService
执行异步操作(例如,使用 Callback
的 Retrofit 调用),因为这样会破坏 IntentService
的目的>(向操作系统表明您正在工作)。因此,在 IntentService
中,您可以使用 Retrofit 的同步 API,无需 Callback
。
关于android - 是否有任何开发模式可以替代网络请求的 IntentService?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31346851/