【问题标题】:CN1 stop() method not working every time when issuing Rest API call每次发出 Rest API 调用时,CN1 stop() 方法都不起作用
【发布时间】:2020-04-01 12:34:16
【问题描述】:

使用 stop() 方法发出 rest api 调用,并将数据发送到云端(根据连接情况可能需要 0.1s-5s)是否明智?

requestBuilder.acceptJson().body(jsonDataBody).getAsJsonMap()

我问,因为我可以始终如一地在模拟器上重现一个问题,即当我关闭应用程序时没有发送数据,但如果我通过按钮调用相同的进程,它就会消失。在真实设备上它似乎工作正常,但我偶尔会收到客户反馈说它并不总是有效,即。数据没有被发送到云端(没有错误)。我无法使用自己的真实设备重现它。

当我进行屏幕导航时,我不得不盲目地编写代码并通过输入一个新的异步休息调用来强制它,这与 stop() 相同,但使用此方法

requestBuilder.acceptJson().body(jsonDataBody).fetchAsJsonMap()

背景: 我的数据在一个云数据库中,前面是 Rest APi。我的应用程序使用存储来存储上次上传和下载数据的日期时间。当我通过 start() 打开我的应用程序时,它会发出一个休息呼叫并获取所有数据,其中包含日期时间戳 > 上次下载日期时间。当我关闭我的应用程序时,我通过 stop() 发出另一个调用,将自上次上传日期时间以来本地更改的所有数据发送到云。每条记录都有一个 lastUpdateDatetime 实体属性。

谢谢

【问题讨论】:

    标签: codenameone


    【解决方案1】:

    这是有问题的,原因有两个。首先是更简单的情况:

    • 操作系统可以快速调用stop()/start(),因此您的应用程序几乎会立即停止和启动,如果您不加以防范,这可能会触发数据损坏

    • 更糟糕的问题是,如果一个操作需要更长的时间,一些操作系统可能会杀死它。您可以在应用未运行时使用后台获取来执行下载/上传,这将解决此处的技术问题

    就个人而言,我只会发送有关更改的数据。如果更改太快,我会添加发送时间阈值,但在应用程序运行期间发送,而不是在stop() 上发送。请注意,在设备上情况要复杂得多,因为它可能会突然决定终止应用程序以为手机应用程序或其他关键应用程序腾出空间。您需要进行防御性编程,并尽可能避免假设。

    【讨论】:

    • 嗯,好的。这与我读过的有关与服务器同步的方法的其他网站背道而驰,尽管我理解您在说什么,因此为什么我的一些客户遇到问题而其他客户却没有。我曾经上传和下载记录仅在页面条目和记录更改时同步,但这会导致导航速度变慢,并且有时会在网络速度慢或出现故障时冻结。所以我认为解决方案是按照主要评论并在页面导航异步上传数据(并隐藏网络错误)并仅在应用程序入口 start() 上下载。希望这听起来不错。感谢您的回复。
    • 这里有一个非常微妙的平衡。这样想,如果应用程序或设备在使用过程中崩溃,您不希望丢失所有更改。因此,在应用程序运行时发送它们很重要。但是立即或通过 EDT 执行此操作是错误的,因为它会影响性能。我们拥有的一件很酷的事情是 EDT 空闲回调 callSeriallyOnIdle 您可以在 EDT 不做任何事情(没有动画等)时使用它来运行,然后您可以调用异步 API 将数据上传到服务器。这不应以任何方式影响运行时性能。
    • 这就是我要走的路。早期的客户反馈是数据现在正在同步,因为它从 stop() 中取出。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    相关资源
    最近更新 更多