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

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

在我与同事开发的当前应用程序中,我们在内部使用带有 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/

相关文章:

android - 如何在您的 Android 应用程序中使用谷歌帐户

android - SSL 握手中止 : ssl=0x74d2dc46c8: Failure in SSL library, 通常是协议(protocol)错误 OPENSSL_internal:SSLV3_ALERT_HANDSHAKE_FAILURE

java - 我在 Android Studio 中使用 Wea​​therstack API 在 Retrofit 中得到空值

android - 自定义 ViewGroup.dispatchTouchEvent() 无法正常工作

Android M 6.0权限问题

android - Volley 中的 API 问题

android - 在没有 OkHttp 的情况下改造公共(public) header ?

retrofit - 是否可以同步运行可观察的改造?

java - 在 Rx Observable 事务中使用 Realm 调用时,如何防止 Realm 线程问题?

android - 使用 RX-Java 进行相关操作和 http 请求