我现在试图解决@kyle-ivey 的担忧,因为响应到达两者之间onPause()
并被onResume()
丢弃。这是一个真正的问题,因为我在实时应用程序中经历过。
我的方法建立在 Thomas Moerman 的答案中实现的事件总线模式之上,尽管我已经从头开始重新实现了一个示例应用程序。它依赖于Otto 事件总线库、Gson和Volley。它是在 IntelliJ 13 Ultimate 中使用 Maven 解决依赖关系实现的。
解决方案:我在前面的答案中添加了一个充当 HTTP 响应缓冲区的类,它负责在 Activity 转换时监听事件。完成后,活动会主动轮询在活动与事件总线断开连接时可能已经到达的任何响应。它以如下方式在事件总线注册旁边的onPause
和事件中挂接/关闭:onResume
@Override
protected void onPause() {
super.onPause();
ServiceLocator.ResponseBuffer.startSaving(); // The buffer takes over
ServiceLocator.EventBus.unregister(this); // Unregistering with Otto
}
@Override
protected void onResume() {
ServiceLocator.EventBus.register(this); // Re-registering
ServiceLocator.ResponseBuffer.stopAndProcess(); // Process any responses buffered
}
这是ResponseBuffer-class的实现。
警告 1:如果该活动从未恢复,并且在任何未来的活动中都stopAndProcess()
没有stopAndPurge()
被调用,则缓冲区可能是内存泄漏的来源。请注意您如何使用它。一个安全的模式是stopAndProcess()
在 你onResume()
的所有活动中都有。
警告 2:它不是线程安全的。如果在它开始保存和取消注册事件总线之间的线路上发生上下文切换,它可能会收到两次或零次事件。
该示例包含一些 UI 和支持类形式的测试代码,但如果您想在单独的项目中使用此模式,则需要的主要类是以下包中的类:
- nilzor.ottovolley.core
- nilzor.ottovolley.messages
有关用于测试的 UI 的完整示例,请参阅 github-repository OttoVolleyDoneRight 。