是否有任何开发模式可以替代网络请求的 IntentService?
Is there any development pattern that can replace an IntentService for network requests?
在我与同事一起开发的当前应用程序中,我们在内部使用带有 Volley 调用的 IntentServices 来处理 RESTful API 网络请求。这只是简单的 JSON 字符串数据和一些小图像。
我想问那些在处理网络请求方面有经验的人的问题是:是否有更合适或更清洁的东西可以在那里实施?
据我了解,使用 IntentService 的优势在于它 运行 在主线程的后台运行,并且通常是 Android OS。缺点是 IntentServices 是 运行 顺序。
我已经阅读了很多关于 RxJava 和 Retrofit 的文章,并且觉得这种组合可以更好地满足我们的需求。改造本身可能就足够了,但我真的很感谢第三方的一些见解。
仅仅使用 IntentServices 来执行一个简单的网络请求,IMO,已经太多了。如果您不想使用库或者您更喜欢 Retrofit、Volley...(我会推荐 Retrofit),您应该使用 AsyncTask。
IMO、服务或本例中的 IntentService 旨在执行长时间的后台任务。
真正的问题是:即使没有 UI 可见,您加载数据是为了在前台填充 Activity 还是为了进行后台工作?
对于后台工作,服务是最佳选择。如果您依赖 Volley 的线程管理,您甚至不需要 IntentService。
对于前台工作,请考虑直接在 Activity/Fragment 中使用 Loaders、Volley 或 Rxjava 调用。
我的一般经验法则是:
如果网络I/O应该在一秒之内,而且你不介意它没有运行完成,任何异步选项都应该没问题。
如果网络 I/O 应该超过一秒,或者你真的想增加它 运行 完成的几率,请使用 Service
.是否使用 IntentService
或其他一些 Service
实现取决于你,但你希望有一个 Service
作为你正在工作的 OS 的指标,因此,一旦您的应用移至后台,它就不会很快终止您的进程。请记住,"moves to the background" 并不总是由用户直接发起的,因为传入 phone 呼叫等也会将您转移到后台。
如果网络I/O会超过15秒,不仅需要用一个Service
,还需要考虑一个WakeLock
(通过我的 WakefulIntentService
,或 WakefulBroadcastReceiver
,或您自己精心管理的 WakeLock
)和可能的 WifiLock
。 15 秒是设置中的最短自动屏幕关闭时间,这是该数字的来源。
考虑到所有这些:
The downside being that IntentServices are run sequentially.
我正在将其翻译为 "an IntentService
has a single thread for processing requests"。这是真实的。如果您需要 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
这与您是否使用Service
无关。只是不要尝试从 IntentService
执行异步操作(例如,使用 Callback
的 Retrofit 调用),因为您违背了 IntentService
的目的(指示 OS 你在工作)。因此,从 IntentService
开始,您将使用 Retrofit 的同步 API,而不使用 Callback
.
在我与同事一起开发的当前应用程序中,我们在内部使用带有 Volley 调用的 IntentServices 来处理 RESTful API 网络请求。这只是简单的 JSON 字符串数据和一些小图像。
我想问那些在处理网络请求方面有经验的人的问题是:是否有更合适或更清洁的东西可以在那里实施?
据我了解,使用 IntentService 的优势在于它 运行 在主线程的后台运行,并且通常是 Android OS。缺点是 IntentServices 是 运行 顺序。
我已经阅读了很多关于 RxJava 和 Retrofit 的文章,并且觉得这种组合可以更好地满足我们的需求。改造本身可能就足够了,但我真的很感谢第三方的一些见解。
仅仅使用 IntentServices 来执行一个简单的网络请求,IMO,已经太多了。如果您不想使用库或者您更喜欢 Retrofit、Volley...(我会推荐 Retrofit),您应该使用 AsyncTask。 IMO、服务或本例中的 IntentService 旨在执行长时间的后台任务。
真正的问题是:即使没有 UI 可见,您加载数据是为了在前台填充 Activity 还是为了进行后台工作?
对于后台工作,服务是最佳选择。如果您依赖 Volley 的线程管理,您甚至不需要 IntentService。
对于前台工作,请考虑直接在 Activity/Fragment 中使用 Loaders、Volley 或 Rxjava 调用。
我的一般经验法则是:
如果网络I/O应该在一秒之内,而且你不介意它没有运行完成,任何异步选项都应该没问题。
如果网络 I/O 应该超过一秒,或者你真的想增加它 运行 完成的几率,请使用
Service
.是否使用IntentService
或其他一些Service
实现取决于你,但你希望有一个Service
作为你正在工作的 OS 的指标,因此,一旦您的应用移至后台,它就不会很快终止您的进程。请记住,"moves to the background" 并不总是由用户直接发起的,因为传入 phone 呼叫等也会将您转移到后台。如果网络I/O会超过15秒,不仅需要用一个
Service
,还需要考虑一个WakeLock
(通过我的WakefulIntentService
,或WakefulBroadcastReceiver
,或您自己精心管理的WakeLock
)和可能的WifiLock
。 15 秒是设置中的最短自动屏幕关闭时间,这是该数字的来源。
考虑到所有这些:
The downside being that IntentServices are run sequentially.
我正在将其翻译为 "an IntentService
has a single thread for processing requests"。这是真实的。如果您需要 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
这与您是否使用Service
无关。只是不要尝试从 IntentService
执行异步操作(例如,使用 Callback
的 Retrofit 调用),因为您违背了 IntentService
的目的(指示 OS 你在工作)。因此,从 IntentService
开始,您将使用 Retrofit 的同步 API,而不使用 Callback
.