【问题标题】:Network requests with callback functions, how to process results from queued requests带有回调函数的网络请求,如何处理排队请求的结果
【发布时间】:2014-09-30 23:09:52
【问题描述】:

使用 Volley 或其他网络库,可能需要将网络请求添加到队列中,以便稍后发送请求。

将这些对象发送到队列的问题在于,当对象确实被发送时,似乎没有一种明显的方法来处理服务器返回的网络调用的结果,因为这发生在对象的嵌套回调函数。

我的网络请求通常是内联的,并且是我的活动、片段和服务的一部分,并且响应使用并设置在这些活动、片段和服务的其他部分中声明的变量。有时会更改 UI 线程中的视觉元素。

如果这些请求被排队,而这个队列稍后在网络连接更有利时被清空,我似乎没有直观的方式来访问回调方法

有解决办法吗?也许有人在回调方法或其他一些事件总线中使用了一堆广播接收器来抽象出这种设计范式。

感谢您的任何见解

【问题讨论】:

    标签: android queue offline android-volley


    【解决方案1】:

    我的网络请求通常是内联的,并且是我的活动、片段和服务的一部分,并且响应使用并设置在这些活动、片段和服务的其他部分中声明的变量。有时会更改 UI 线程中的视觉元素。

    这不是一个好主意。特别是,当您的请求在工作队列中挂起时,活动和片段可能已被破坏。至少,您正在防止活动和片段被垃圾收集。更糟糕的是,您的结果可能会发送到错误的 UI 组件(例如,活动被销毁并重新创建,因此结果应该发送到新活动实例,但您将请求绑定到旧活动实例)。

    有解决办法吗?

    我会使用事件总线,尤其是 greenrobot 的 EventBus 以实现线程灵活性。让Service 管理您的工作队列,当队列清空时关闭。当工作完成时,各个操作会引发事件。当这些事件相关时(例如,当活动/片段在前台时),对这些事件感兴趣的事物注册和注销以接收它们。这样,工作(网络 I/O)与处理工作结果(例如,更新 UI)更加分离。

    【讨论】:

    • 我一直在看greenrobot的EventBus,你有使用它的例子吗?我正在使用 Volley
    • 谢谢,不过我仍然有一个与 Volley 相关的问题。我想将我的请求对象存储在一个列表中,并在它们能够发布到网络时将它们删除。这些对象内部仍然有回调,我不知道如何让它们运行。其中一个回调是网络错误处理程序,这就是我必须从列表中添加或删除请求对象的地方,但这成为自引用的,我的 IDE 甚至不喜欢这样。好奇其他人如何使用 Volley 来做到这一点
    • @CQM:对不起,我不使用 Volley,所以我帮不上忙。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 2013-09-13
    • 2017-07-11
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    相关资源
    最近更新 更多