Android Volley + Loader 模式是什么?

22

我有点喜欢Volley框架,但对它仍然有一些疑虑。

例如,Volley框架如何与Loader模式相匹配?由于其请求以异步方式处理,因此在后台调用它并没有太多意义。另一方面,如果我们忽略Loader模式,则会取消加载并重新加载必要的资源,这有点浪费。

Volley框架如何在Android中与Loader一起工作?

4个回答

12

Loader 可以封装几乎任何东西,包括 Volley 请求。当您的 Loader 封装了一个已经为您处理后台工作并在主线程上回调您的框架(例如 Volley)时,您的 Loader 实现不能继承自 AsyncTaskLoader,而只能继承自 Loader 基类。然后,您可以在 onForceLoad() 方法中启动 Volley 请求。

当您的 Loader 通过回调在主线程上收到结果时,只需要调用 deliverResult() 将结果推送到 Activity/Fragment。

您的 Loader 还需要保持对正在进行的 Volley 请求的引用,以便在 onStopLoading() 中取消它。仅在离开 Activity 时才会调用 onStopLoading(),而不会在屏幕旋转等配置更改时调用。

唯一的缺点是 Loader 没有内置机制来传播错误,而 Volley 有。因此,在您的 Loader 内部的 Volley 错误回调中,您需要传递空结果或发送本地广播来通知 Activity/Fragment 发生错误。


4
据我所知并从来源中看到,如果服务器发送适当的缓存头(ETag),则对您的请求的响应将被缓存。第二次您尝试对同一URL进行GET请求时,您将从缓存中获得响应,而不是再次调用网络。(默认情况下,Volley使用URL作为键来缓存请求)。
将请求添加到RequestQueue应该从MainThread中完成,因为从后台线程调用它们没有意义。

我在思考一种情况,即用户在加载过程中旋转设备。 Volley框架的正常行为是在方向更改完成时取消请求并重新启动它们。使用Loader模式可以保护加载状态免受方向更改的影响。 - husrevo
是的,您是正确的。没有直接的、开箱即用的方法来“重新连接”到一个挂起的请求,或者“保持它”运行并在方向更改/活动停止-恢复时获取响应。 - Ovidiu Latcu
1
在加载推送通知之前,如果需要加载附加信息,则最好从后台线程调用它。然而,对于一般情况,最好从主线程调用它。 - Gabriel

3

1

通过RequestFuture类,可以使用Volley进行同步请求。我个人没有深入研究过这一点,但看起来你可以利用它与Loader结合使用,以获得最佳效果(既有Volley的缓存功能,又具备Loader的加载稳定性)。


这样,您的“Loader”就不能返回中间和最终结果。 “RequestFuture”仅返回第一个接收到的结果(如果使用缓存,则为中间结果);最终结果只更新缓存,无法传播到UI。 - Andrii Chernenko
好的观点。目前,我不建议使用加载器,因为它们有太多的开销,最好从外部库(如Retrofit或Volley)创建自己的解决方案。 - Gabriel
不需要同步请求。如果您扩展了 Loader<D>,则预计您会在后台线程中执行工作。 - Pijusn
如果您有多个需要处理的请求,最好在一个异步线程中完成所有请求,而不是必须链接回调函数。实际上,您无法在AsyncLoader中异步使用Volley,因为如果它不是从主线程调用,它会抛出错误。 - Gabriel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接