首页 > 解决方案 > Android 在 onDestroy 中发送 HTTP Post

问题描述

所以对于我的应用程序,我只需要一种将数据同步到服务器的简单方法。我不需要担心任何回应(至少现在是这样)。我认为这就像从我的主要活动的 onDestroy 启动服务一样简单,但由于某种原因,该服务从未被创建。是否不可能通过意图附加功能从 onDestroy 提供新服务?从我能够调试的情况来看,变量永远不会被放入包中。下面是我的 onDestroy() 代码。

    Intent intent = new Intent(this, CustomService.class);
    Bundle extras = intent.getExtras();
    extras.putString(Variables.REFRESH_TOKEN_KEY, apiGateway.getTokens().getRefreshToken());
    extras.putString(Variables.ID_TOKEN_KEY, apiGateway.getTokens().getIdToken());
    try {
        extras.putString(RequestFields.CustomObject, new ObjectMapper().writeValueAsString(CustomObject.asMap()));
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }
    startService(intent);

我不能像我想的那样发出盲目的请求(没有服务,因为这看起来有点过分了),因为显然你不能在主 UI 线程上发出网络请求。想知道是否有更好的方法可以在不使用服务的情况下执行这样的盲目请求,从而绕过我的问题,因为一开始就无法启动它。

标签: javaandroid

解决方案


如果您需要替代解决方案,可以使用 java.util.concurrent API。Executors 非常方便且易于使用。

顺便说一句onDestroy() javadoc 说:

注意:不要指望这个方法被称为保存数据的地方!例如,如果一个活动正在内容提供者中编辑数据,那么这些编辑应该在 onPause() 或 onSaveInstanceState(Bundle) 中提交,而不是在此处提交”。我认为永远不会调用 onDestroy 可能会发生。

但也要注意 onPause:

当活动 B 在活动 A 之前启动时,将在 A 上调用此回调。在 A 的 onPause() 返回之前不会创建 B,因此请确保此处不要做任何冗长的事情。

此回调主要用于保存活动正在编辑的任何持久状态,向用户呈现“就地编辑”模型,并确保如果没有足够的资源来启动新活动而不首先杀死该活动,则不会丢失任何内容。这也是停止消耗大量 CPU 的事情的好地方,以便尽快切换到下一个活动。( JavaDoc )

真正的问题是:您是否需要每次“用户不再主动与活动交互,但它仍然在屏幕上可见”[ 2 ] 时都将数据同步到服务器?onPause 应该用于保存“UI 字段状态”。这取决于您的用例,也许更好的选择是每 5 分钟同步一次,但我不确定如何管理关闭服务。


推荐阅读