Android排球 - 方向变化

时间:2013-06-20 16:26:29

标签: android android-networking android-volley

我们如何处理方向更改,Activities / Fragments使用Volley停止/恢复?

我知道对于GET请求,响应将被缓存,第二次我们尝试发出请求时,我们将获得缓存响应。(如果服务器发送正确的HTTP头)

但是POST呢?假设我发出POST个请求(即注册,我想只发生一次),我的应用程序转到后台,请求在应用程序仍在后台时完成,然后我回到应用程序。我如何获得Response的{​​{1}},或者如果它仍处于待处理状态,我该如何重新连接到它?

AFAIK在Request中几乎不支持这一点。我对吗?有没有一种简单的方法可以使用Volley

来解决上述情况

4 个答案:

答案 0 :(得分:8)

Volley没有提供开箱即用的机制,但你可以查看Square的Android版Otto库,它可以优雅地处理你的情况。

为Volley请求实现监听器,以便它将成功的响应发布到总线上,包含在像“RegisterEventSuccess”这样的事件对象中(您自己定义)。让您的活动或片段使用Otto的@Subscribe机制订阅此事件类型。如果 - 例如 - 一个Activity启动Volley请求并因屏幕方向更改而死亡,则另一个Activity实例(也注册到Otto总线)可以接收包含Volley请求响应的事件。

希望这很有用。

答案 1 :(得分:4)

我现在试图解决@ kyle-ivey的问题,即onPause()onResume()之间的响应被丢弃。这是一个真正的问题,因为我在实时应用程序中体验过它。

我的方法建立在Thomas Moerman的答案中实现的事件总线模式之上,尽管我从头开始重新实现了一个示例应用程序。这取决于Otto Event bus LibraryGsonVolley。它在IntelliJ 13 Ultimate中实现,使用Maven tom解析依赖关系。

解决方案:我在前面的答案中添加了一个充当HTTP响应缓冲区的类,它接管在Activity转换时监听事件的责任。完成后,活动会主动轮询在活动与事件总线断开连接时可能已到达的任何响应。它在onPauseonResume - 事件总线旁边的事件中挂起/关闭,以这样的方式注册:

@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
}

以下是the ResponseBuffer-class的实施。

警告1 :如果活动从未恢复,并且在将来的任何活动中都未调用stopAndProcess()stopAndPurge(),则缓冲区可能是内存泄漏的来源。请注意您如何使用它。安全模式是在{em>所有活动中的stopAndProcess()onResume()

警告2 :它不是线程安全的。如果要在星形保存的位置之间进行上下文切换并且取消注册事件总线,则它可以接收事件两次或零次。

该示例包含一些UI和支持类形式的测试代码,但如果要在单独的项目中使用此模式,则需要的主要类是以下包中的类:

  • nilzor.ottovolley.core
  • nilzor.ottovolley.messages

有关测试用户界面的完整示例,请参阅github-repository OttoVolleyDoneRight

答案 2 :(得分:0)

有一个简单的解决方案可以解决我使用Volley库从网络下载数据的问题。如果您的应用使用了Google推荐的片段,那么如果用户在加载数据时旋转屏幕,则应该采取一切措施防止崩溃{?1}}在片段的setRetainInstance(true);方法(-s)中。

onCreateView

答案 3 :(得分:0)

假设您具有登录按钮,通过截击单击Btn呼叫服务器,突然如果屏幕方向发生变化,截击将重新启动,并且应用程序崩溃。

所以我的解决方法是:单击第一个Btn锁定屏幕方向,当Volley响应出现时,您解锁屏幕方向...

.........这里 单击--lockDeviceRotation(true)//锁定 on Response--lockDeviceRotation(false)//解锁

switch(button) { // this is a code for C structure
case 1: do some things ( not just display text)
case 2: do some things ( not just display text)