使用Volley或其他网络库,可能需要将网络请求添加到队列中,以便稍后发送请求。
将这些对象发送到队列的问题是,当对象确实被发送时,似乎并不是处理服务器返回的网络调用结果的明显方法,因为这发生在对象的嵌套回调函数。
我的网络请求通常是内联的,是我的活动,片段和服务的一部分,响应使用和设置在这些活动,片段和服务的其他部分中声明的变量。有时会改变UI线程中的可视元素。
如果这些请求排队并且稍后当网络连接更有利时清空此队列,我似乎没有直观的方式来访问回调方法
有解决方案吗?也许有人在回调方法或其他一些事件总线中使用一堆广播接收器来抽象出这种设计范例。
感谢您的任何见解
答案 0 :(得分:3)
我的网络请求通常是内联的,是我的活动,片段和服务的一部分,响应使用和设置在这些活动,片段和服务的其他部分中声明的变量。有时会改变UI线程中的可视元素。
这不是一个好主意。特别是,当您的请求在工作队列中挂出时,活动和碎片可能已被销毁。至少,您要防止活动和碎片被垃圾收集。更糟糕的是,您的结果可能会转到错误的UI组件(例如,活动被销毁并重新创建,因此结果应该转到新的活动实例,但您将请求绑定到旧的活动实例)。
有解决方法吗?
我使用事件总线,尤其是greenrobot的EventBus,以提高线程的灵活性。让Service
管理您的工作队列,在队列清空时关闭。当工作完成时,各个操作会引发事件。当这些事件相关时(例如,当活动/片段在前台时),对这些事件感兴趣的事物注册并注销以接收它们。这样,工作(网络I / O)与处理工作结果(例如,更新UI)更加分离。