2017-05-25 118 views
1

我希望我能很好地解释这个...Android的 - 之后API请求回叫的onDestroy

我想更好地了解如何处理HTTP在Android的回调,所以我创建了一个使用凌空一个简单的HTTP应用程序要求。它只有一个触发HTTP请求的按钮,基本上,它只是更新数据库中的一个数字,并在5秒后通过JSON响应发送它。活动获取响应并在TextView中显示响应。我正在使用设置 - 开发人员选项启用“不保留活动”选项的真实设备进行测试。

这是我测试的情景:

  1. 启动应用程序。
  2. 点击触发HTTP请求的按钮。
  3. 点击按钮后立即点击设备的主页按钮将应用程序发送到后台。由于“不保留活动”选项,因此调用onDestroy方法。
  4. 等待几秒钟的HTTP响应。我可以看到设备获取它,因为它被打印在logcat监视器中并且数据库被更新。
  5. 运行回调之前,我检查活动是否仍然存在。由于活动已被销毁,回调将被忽略。如果应用程序从后台恢复,则不会崩溃,但网络响应会丢失。另外,如果我再次点击该按钮时,它发出了一个新的HTTP请求,并再次增加了数...

所以,问题是:

  1. 哪些是提供网络的最佳实践对UI的反应?我的意思是,如果不是一个简单的操作,假设这是一个注册表单,并且我接到了一个电话或是一些迫使我将应用程序发送到后台的事情,那里会发生任何事情,我怎么才能确保不会错过网络回调?有什么可以延迟回调执行,直到应用程序再次在前台?

  2. 有没有办法在onDestroy被调用后保存一个像onSaveInstanceState这样的Bundle,并在app再次处于前台时恢复它?

  3. 让我们假设HTTP响应包含的信息是敏感的。有没有推荐的方法来处理这种情况?我正在考虑将响应保存在内部存储器中,并在应用程序再次处于前台时检查它,但我不知道在调用onDestroy之后是否可以这样做,或者如果它不是一个好主意敏感数据。

在此先感谢!

回答

0

1)YOu永远不会错过网络回调。即使你在后台,你也会被调用,除非你的整个应用程序(不只是活动被杀死)。您只会在背景中看到回调。

2)没有。如果在下次活动开始时需要网络调用的结果,我建议您使用Loader来加载数据。这样您可以在下次查询Loader结果时,只在需要时才启动请求。

3)做我在2中提出的建议,并且不需要这个问题,它的全部都在应用程序内存中。

+0

Hi @Gabe ... 1。通过“不错过回调”我的意思是不会错过该块的执行。事实上,我正在获得回调,但我无法使用它来更新我的UI,因为它已被销毁。 2&3。谢谢,我会尝试使用Loader。无论如何,你有什么样的例子吗? – allo86

+0

加载程序也修复了这个问题 –

+0

我试图将加载程序与MVP结合起来。我已经阅读了一些鼓励使用Loaders来保留演示者的文章,但是我也发送了来自演示者的Volley请求(以每个例子的身份登录一个用户),并且我遇到了和以前一样的问题:回调可以传递给当视图(Activity,Fragment)不在前台时,主持人。我想在Presenter中使用Loader,但这似乎不是一个好主意,因为Presenter应该避免使用android导入。你知道或有一个想法如何管理这种情况? – allo86